目录
7.2 字典(dict) 可变、无序、键不重复 且 元素只能是 键值对 的容器
Day07:数据类型(下)
7.1 集合(set)无序 、可变、不允许数据重复的容器
-
无序,无法通过索引取值。
-
可变,可以添加和删除元素。
-
不允许数据重复。
v1 = {11,22,33,44} v1.add(22) print(v1) # {11,22,33,44}
-
创建空集合方法
data = set() print(type(data)) #<class 'set'> 集合类型
一般什么时候用集合呢?
就是想要维护一大堆不重复的数据时,就可以用它。比如:做爬虫去网上找图片的链接,为了避免链接重复,可以选择用集合去存储链接地址。
7.1.1 独有功能
7.1.1.1 add 添加元素
data = {"刘嘉玲", '关之琳', "王祖贤"}
data.add("郑裕玲")
print(data)
7.1.1.2 discard 删除元素
data = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟", "李若彤"}
data.discard("关之琳")
print(data)
7.1.1.3 intersection 交集
s1 = {"刘能", "赵四", "⽪⻓⼭"}
s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
s4 = s1.intersection(s2) # 取两个集合的交集
print(s4) # {"⽪⻓⼭"}
7.1.1.4 union 并集
s1 = {"刘能", "赵四", "⽪⻓⼭"}
s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
s4 = s1.union(s2) # 取两个集合的并集 {"刘能", "赵四", "⽪⻓⼭","刘科⻓", "冯乡⻓", }
print(s4)
s3 = s1 | s2 # 取两个集合的并集
print(s3)
7.1.1.5 difference 差集
s1 = {"刘能", "赵四", "⽪⻓⼭"}
s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
s4 = s1.difference(s2) # 差集,s1中有且s2中没有的值 {"刘能", "赵四"}
s6 = s2.difference(s1) # 差集,s2中有且s1中没有的值 {"刘科⻓", "冯乡⻓"}
s3 = s1 - s2 # 差集,s1中有且s2中没有的值
s5 = s2 - s1 # 差集,s2中有且s1中没有的值
print(s5,s6)
7.1.2 公共功能
7.1.2.1 减,计算差集
s1 = {"刘能", "赵四", "⽪⻓⼭"}
s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
s3 = s1 - s2
s4 = s2 - s1
print(s3)
print(s4)
7.1.2.2 &,计算交集
s1 = {"刘能", "赵四", "⽪⻓⼭"}
s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
s3 = s1 & s2
print(s3)
7.1.2.3 |,计算并集
s1 = {"刘能", "赵四", "⽪⻓⼭"}
s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
s3 = s1 | s2
print(s3)
7.1.2.4 len 长度
v = {"刘能", "赵四", "尼古拉斯"}
data = len(v)
print(data)
7.1.2.5 for循环
v = {"刘能", "赵四", "尼古拉斯"}
for item in v:
print(item)
7.1.3 转换
转换为集合类型,可以通过set进行转换,并且如果数据有重复自动剔除。
提示:int/list/tuple/dict都可以转换为集合。
data = {11,22,33,3,99}
v1 = list(data) # [11,22,33,3,99]
v2 = tuple(data) # (11,22,33,3,99)
提示:这其实也是去重的一个手段。
7.1.4 其他(补充扩展)
因存储原理,集合的元素必须是可哈希的值,即:内部通过通过哈希函数把值转换成一个数字。
注意:由于True和False本质上存储的是 1 和 0 ,而集合又不允许重复,所以在整数 0、1和False、True出现在集合中会有如下现象:
v1 = {True, 1}
print(v1) # {True}
v2 = {1, True}
print(v2) # {1}
v3 = {0, False}
print(v3) # {0}
v4 = {False, 0}
print(v4) # {False}
7.2 字典(dict) 可变、无序、键不重复 且 元素只能是 键值对 的容器
-
容器
-
元素必须键值对
-
键不重复,重复则会被覆盖
data = { "k1":1, "k1":2 } print(data) # {"k1":2}
-
无序(在Python3.6+字典就是有序了,之前的字典都是无序。)
字典中对键值得要求:
-
键:必须可哈希。 目前为止学到的可哈希的类型:int/bool/str/tuple;不可哈希的类型:list/set/dict。(集合)
-
值:任意类型。
一般在什么情况下会用到字典呢?
当我们想要表示一组固定信息时,用字典可以更加的直观,例如:
# 用户列表
user_list = [ {"name":"大烧饼","pwd":"123"}, {"name":"小烧饼","pwd":"123"} ]
7.2.1 独有功能
7.2.1.1 get 获取值
info = {
"age":12,
"status":True,
"name":"大烧饼",
"data":None
}
data1 = info.get("name")
print(data1) # 输出:大烧饼
7.2.1.2 keys 所有的键
info = {"age":12, "status":True, "name":"dashaobing","email":"xx@live.com"}
data = info.keys()
print(data) # 输出:dict_keys(['age', 'status', 'name', 'email']) py2 -> ['age', 'status', 'name', 'email']
注意:在Python2中 字典.keys()直接获取到的是列表,而Python3中返回的是`高仿列表`,这个高仿的列表可以被循环显示。
7.2.1.3 values 所有的值
info = {"age":12, "status":True, "name":"dashaobing","email":"xx@live.com"}
data = info.values()
print(data) # 输出:dict_values([12, True, 'wupeiqi', 'xx@live.com'])
注意:在Python2中 字典.values()直接获取到的是列表,而Python3中返回的是高仿列表,这个高仿的列表可以被循环显示。
7.2.1.4 items 所有的键值
info = {"age":12, "status":True, "name":"dashaobing","email":"xx@live.com"}
data = info.items()
print(data) # 输出 dict_items([ ('age', 12), ('status', True), ('name', 'dashaobing'), ('email', 'xx@live.com') ])
7.2.1.5 setdefault 设置值
data = {
"name": "大烧饼",
"email": 'xxx@live.com'
}
data.setdefault("age", 18)
print(data) # {'name': '大烧饼', 'email': 'xxx@live.com', 'age': 18}
注意:如已有则不会设置
7.2.1.6 update 更新字典键值对
info = {"age":12, "status":True}
info.update( {"age":14,"name":"大烧饼"} ) # info中没有的键直接添加;有的键则更新值
print(info) # 输出:{"age":14, "status":True,"name":"大烧饼"}
7.2.1.7 pop 移除指定键值对
info = {"age":12, "status":True,"name":"大烧饼"}
data = info.pop("age")
print(info) # {"status":True,"name":"大烧饼"}
print(data) # 12
7.2.1.8 popitem 按照顺序移除(后进先出)
info = {"age":12, "status":True,"name":"大烧饼"}
data = info.popitem() # ("name","大烧饼" )
print(info) # {"age":12, "status":True}
print(data) # ("name","大烧饼")
- py3.6后,popitem移除最后的值。
- py3.6之前,popitem随机删除。
7.2.2 公共功能
7.2.2.1 | 求并集(Python3.9新加入)
v1 = {"k1": 1, "k2": 2}
v2 = {"k2": 22, "k3": 33}
v3 = v1 | v2
print(v3) # {'k1': 1, 'k2': 22, 'k3': 33}
7.2.2.2 len 长度
info = {"age":12, "status":True,"name":"大烧饼"}
data = len(info)
print(data) # 输出:3
7.2.2.3 in 是否包含
info = { "age":12, "status":True,"name":"武沛齐" }
v1 = "age" in info
print(v1)
7.2.2.4 get 索引(键)
info = { "age":12, "status":True, "name":"大烧饼"}
print( info["age"] ) # 输出:12
print( info["name"] ) # 输出:大烧饼
print( info["status"] ) # 输出:True
print( info["xxxx"] ) # 报错,通过键为索引去获取之后时,键不存在会报错(以后项目开发时建议使用get方法根据键去获取值)
value = info.get("xxxxx") # None
print(value)
7.2.2.5 键 修改值 和 添加值 和 删除键值对
# 修改值
info = {"age":12, "status":True,"name":"大烧饼"}
info["gender"] = "男"
print(info) # 输出: {"age":12, "status":True,"name":"大烧饼","gender":"男"}
# 添加值
info = {"age":12, "status":True,"name":"大烧饼"}
info["age"] = "18"
print(info) # 输出: {"age":"18", "status":True,"name":"大烧饼"}
# 删除键值对
info = {"age":12, "status":True,"name":"大烧饼"}
del info["age"] # 删除info字典中键为age的那个键值对(键不存在则报错)
print(info) # 输出: {"status":True,"name":"大烧饼"}
info = {"age": 12, "status": True, "name": "大烧饼"}
if "agea" in info:
# del info["age"]
data = info.pop("age")
print(info)
print(data)
else:
print("键不存在")
7.2.2.6 for循环
由于字典也属于是容器,内部可以包含多个键值对,可以通过循环对其中的:键、值、键值进行循环;
# 所有键(默认就是循环键)
info = {"age":12, "status":True,"name":"大烧饼"}
for item in info:
print(item) # 所有键
# 所有键
info = {"age":12, "status":True,"name":"大烧饼"}
for item in info.keys():
print(item)
# 所有值
info = {"age":12, "status":True,"name":"大烧饼"}
for item in info.values():
print(item)
# 所有键值对
info = {"age":12, "status":True,"name":"大烧饼"}
for key,value in info.items():
print(key,value)
7.2.3 转换
转换为字典
v = dict( [ ("k1", "v1"), ["k2", "v2"] ] )
print(v) # { "k1":"v1", "k2":"v2" }
7.2.4 注意事项
-
字典的键必须可哈希(list/set/dict不可哈希)。
info = {
(11,22):123
}
# 错误
info = {
(11,[11,22,],22):"alex"
}
-
字典的值可以是任意类型。
info = {
"k1":{12,3,5},
"k2":{"xx":"x1"}
}
-
字典的键和集合的元素在遇到 布尔值 和 1、0 时,需注意重复的情况。
7.3 浮点型 (float)用于表示小数
v1 = 3.14
关于浮点型的其他知识点如下:
-
在类型转换时需要,在浮点型转换为整型时,会将小数部分去掉。
v1 = 3.14 data = int(v1) print(data) # 3
-
想要保留小数点后N位
v1 = 3.1415926 result = round(v1,3) print(result) # 3.142