python数据类型3
集合
- 集合是一个无序、可变、不允许数据重复的容器
定义
1 | v1 = {11,22,33,"alex"} |
- 无序:无法通过索引取值
- 可变:可以添加和删除元素
1 | v1 = {11,22,33,"alex"} |
- 使用集合的情况
- 想要维护一大堆不重复的数据时,就可以用它。
- 例如:做爬虫去网上找图片的链接,为了避免链接重复,可以选择用集合去存储连接地址
- 注意:定义空集合时
1 | # 只能用 |
- 补充:
1 | v1 = [] |
独有功能
添加元素
1 | data = {"刘嘉玲","关之琳","王祖贤"} |
删除元素
1 | data = {"刘嘉玲","关之琳","王祖贤","张曼玉","李若彤"} |
交集
1 | s1 = {"刘能","赵四","皮长山"} |
并集
1 | s1 = {"刘能","赵四","皮长山"} |
差集
1 | s1 = {"刘能","赵四","皮长山"} |
公共功能
减 计算差集
1 | s1 = {"刘能","赵四","皮长山"} |
& 计算交集
1 | s1 = {"刘能","赵四","皮长山"} |
| 计算并集
1 | s1 = {"刘能","赵四","皮长山"} |
长度
1 | v = {"刘能","赵四","尼古拉斯"} |
for循环
1 | v = {"刘能","赵四","尼古拉斯"} |
转换
1 | 其他类型如果想要转换为集合类型,可以通过set进行转换,并且如果数据有重复自动剔除。 |
其他
集合的存储原理
- 当创建一个集合的时候,python内部会创建一个表(哈希表)
集合是无序的原因:就是程序经过哈希函数运算后的排列无序
集合的元素必须可哈希
- 因存储原理,集合的元素必须是可哈希的值,即:内部通过哈希函数把值转换成一个数字。
- 目前可哈希的数据类型:int、bool、str、tuple,而list、set是不可哈希的。
- 总结:集合的元素只能是int、bool、str、tuple
转换成功
- 列表转换为集合是可行的
转换失败
- 但是列表里面的元素如果有集合的话,那么转换成集合就会转换失败
查找速度特别快
因存储原理特殊,集合的查找效率非常高(数据量大了才明显)。
低:
1 | user_list = ["武沛齐","alex","李璐"] |
- 元组和列表中判断一个元素在不在里面的查找步骤差不多一样
- 效率高:是因为其组成原理
1 | user_set = {"武沛齐","alex","李璐"} |
- 如果想要判断元素在不在里面,且元素无重复,尽量用集合,效率高
对比和嵌套
- 列表是可以放在元组中的,但是如果列表放在元组里面,然后该元组做为集合的元素放在集合里面的话就不行了。
注意:集合中要求元素必须可哈希集合中元素的元素也必须是可哈希,否则会报错
- 注意:由于True和False本质上存储的是1和0,而集合又不允许重复,所以在整数0、1和False、True出现在集合中会有如下现象
练习题
- 写代码实现
1 | v1 = {"alex","武sir","肖大"} |
- 下面哪些值不能做集合的元素
1 | “” 可以 |
- 模拟用户信息输入程序,已录入则不再创建
1 | user_info_set = set() |
- 给你个列表去重
1 | v = [11,22,11,22,44455] |
None类型
- Python的数据类型中有一个特殊的值None,意味着这个值啥都不是 或 表示空。相当于其他语言中 null 作用一样。
在一定程度上可以帮助我们去节省内存。例如:
1 | v1 = None |
- 目前所有转换为布尔值为False的值有:
1 | 0 |
字典
- 字典是 无序、键不重复 且 元素只能是键值对的可变的 个容器
1 | data = {"k1":1, "k2":2} |
- 容器:元素必须是键值对 “k1”:1是一个键值对 “k2”:2也是一个键值对 冒号前面是键,后面是值,用逗号隔开,用花括号括起来
- 键不重复,重复则会被覆盖
1 | data = {"k1":1,"k1":2} |
- 无序(在python3.6+字典就是有序了,之前的字典都是无序。)
1 | data = {"k1":1, "k2":2} |
定义
1 | v1 = {} |
- 字典中对键值的要求:
- 键:必须可哈希。目前位置学到的可哈希的类型:int/bool/str/tuple;不可哈希的类型:list/set/dict。
- 值:任意类型。
1 | data_dict ={ |
- 一般用到字典的情况
- 当我们想要表示一组固定信息时,用字典可以更加的直观,例如:
1 | # 用户列表 |
独有功能
获取单个值
可以使用get获取值
- 当使用get获取键对应的值时,当键存在则返回对应的值
- 当键不存在就会返回None
示例1:
1 | #示例 |
- 根据示例1,可以对其进行判断:
1 | if data == None: |
获取所有键
- 使用keys()可以获取一个字典的所以键
- 注意:在Python2中字典.keys()直接获取到的是列表,而Python3中返回的是
高仿列表
,这个高仿列表可以被循环显示。Python3的性质可以节省内存 - 例如:
1 | info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} |
- 高仿列表可以被for循环
1 | info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} |
- 还可以利用高仿列表判断某个键是否有在列表中
1 | if "age" in info.keys(): |
获取所有值
- 使用values()可以获取字典里面所有的值
注意:与keys()一样,在Python2中字典.values()直接获取到的是列表,而Python3中返回的是高仿列表,这个高仿列表可以被循环显示
例如:
1 | info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} |
- 对高仿列表值进行循环和判断某个值是否在该字典里面
1 | info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} |
获取所有的键值
可以使用items()字典里面所有的键值,但是获取的值会变成一对的元组,这些元组对被伪列表包裹
例如:
1 | info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} |
- 可以对该伪列表进行循环操作
1 | info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} |
- 还可以进行如下循环的输出
1 | info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} |
- 也可以利用这个伪列表判断键值对是否在字典里面
1 | info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"} |
设置值
- 可以使用setdefult()在字典里面设置值
- 当键不存在,就在字典里面添加这个键值对
- 当键存在,那就不会添加,也不会更改键对应的值
- 例如:
1 | data = {"name":"武沛齐","email":"xxx@live.com"} |
更新字典值对
- 使用update()更新字典里面的键值对
- 如果该键值对不存在,就添加该键值对
- 如果该键存在,则更新该键对应的值
- 例如:
1 | info = {"age":12,"status":True} |
移除指定键值对
- 使用pop()可以移除指定键值对,并返回移除的值
- 例如:
1 | info = {"age":12,"status":True,"name":"武沛齐"} |
按顺序移除(后进先出)
使用popitem()可以按顺序移除键值对,从后往前移出,并返回这个键值对,用元组进行返回
- Python3.6后,popitem移除最后的值
- Python3.6前,popitem随机删除
例如:
1 | info = {"age":12,"status":True,"name":"武沛齐"} |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!
评论