Day07 数据类型(下)
-
dict,字典类型,一个容器,元素必须是键值对
-
Set,集合类型,一个不允许重复&可变类型(元素可哈希)
-
float,浮点类型,常见的小数
1.集合(set)
集合是一个无序、可变、不允许重复的容器
1.1 集合的定义
v = {1,2,3,"GG"}
- 无序,无法通过索引获取元素值
- 可变,可以添加和删除元素
v1 = {1,2,3,5}
v1.add(6)
print(v1)
#{1, 2, 3, 5, 6}
- 不允许数据重复
v1 = {1,2,3,5}
v1.add(2)
print(v1)
#{1, 2, 3, 5}
一般什么时候用集合呢?
就是想要维护一大堆不重复的数据时,就可以用它。比如:做爬虫去网上找图片的链接,为了避免链接重复,可以选择用集合去存储链接地址。
- 定义空集合时,只能使用
v = set()
,不能使用v={}
(这样是定义一个空字典)
1.2 独有功能
1.2.1 添加
v1 = {1,2,3,5}
v1.add(2)
print(v1)
#{1, 2, 3, 5, 6}
data = set()
data.add("aa")
data.add(1)
data.add(456)
print(data)
#{456, 1, 'aa'}
1.2.2 删除
data = {"aa",456,1,"BB"}
data.remove("aa")
data.discard("BB")
print(data)
#{456, 1}
1.2.3 交集
d1 = {"AA","BB","CC","DD","GG"}
d2 = {"BB","DD","GG","FF","HH"}
d3 = d1 & d2 #取交集,方式一
d4 = d1.intersection(d2)#取交集,方式二
print(d3)
#{'BB', 'DD', 'GG'}
1.2.4 并集
d1 = {"AA","BB","CC","DD","GG"}
d2 = {"BB","DD","GG","FF","HH"}
d3 = d1 | d2#取并集,方式一
d4 = d1.union(d2) #取并集,方式二
print(d3)
#{'GG', 'BB', 'HH', 'CC', 'FF', 'DD', 'AA'}
1.2.5 差集
d1 = {"AA","BB","CC","DD","GG"}
d2 = {"BB","DD","GG","FF","HH"}
d3 = d1 - d2#d1中有d2中没有,方式一
print(d3)
{'CC', 'AA'}
d4 = d1.difference(d2)#d1中有d2中没有,方式二
print(d4)
{'CC', 'AA'}
d5 = d2 - d1#d2中有d1中没有,方式一
print(d5)
{'FF', 'HH'}
d6 = d2.difference(d1)#d2中有d1中没有,方式二
print(d6)
{'FF', 'HH'}
1.3 公共功能
1.3.1 减,计算差集
d1 = {"AA","BB","CC","DD","GG"}
d2 = {"BB","DD","GG","FF","HH"}
d3 = d1 - d2
d4 = d2 - d1
print(d3)
#{'CC', 'AA'}
#{'HH', 'FF'}
1.3.2 &,计算交集
d1 = {"AA","BB","CC","DD","GG"}
d2 = {"BB","DD","GG","FF","HH"}
d3 = d1 & d2
1.3.3 |,计算并集
d1 = {"AA","BB","CC","DD","GG"}
d2 = {"BB","DD","GG","FF","HH"}
d3 = d1 | d2
1.3.4 长度
d1 = {"AA","BB","CC","DD","GG"}
print(len(d1))
1.3.5 for 循环
d1 = {"AA","BB","CC","DD","GG"}
for item in d1:
print(item)
#AA
#BB
#GG
#DD
#CC
1.4 转换
- 其他类型如果想要转换为集合类型,可以通过set进行转换,并且如果数据有重复自动剔除。
- int/list/tuple/dict都可以转换为集合类型。
v = "AA"
v1 = set(v)
print(v1)
v = [11,22,33,44,55,66]
v1 = set(v)
- 集合也是去重的一个有效手段
1.5 其他
1.5.1 集合的存储原理
1.5.2 元素必须可哈希
-
集合的元素必须是可哈希的值,内部通过通过哈希函数把值转换成一个数字。
-
目前可哈希的数据类型:int、bool、str、tuple,而list、set是不可哈希的。
-
转换成功
v = [11,22,33,44,55,66]
v1 = set(v)
- 转换失败
li = [1,2,3,4,[1,2,3],44]
li1 = set(li)
#TypeError: unhashable type: 'list'
1.5.3 查找速度特别快
因存储原理特殊,集合的查找效率非常高(数据量大了才明显)
- 效率低
user_list = ["AA", "BB", "GGBoy"]
if "BB" in user_list:
print("在")
else:
print("不在")
user_tuple = ("AA", "BB", "GGBoy")
if "GGBoy" in user_tuple:
print("在")
else:
print("不在")
- 效率高
user_list = {"AA", "BB", "GGBoy"}
if "BB" in user_list:
print("在")
else:
print("不在")
1.5.4 对比和嵌套
类型 | 是否可变 | 是否有序 | 元素要求 | 是否可哈希 | 转换 | 定义空 |
---|---|---|---|---|---|---|
list | 是 | 是 | 无 | 否 | list() | v = []或v = list() |
tuple | 否 | 是 | 无 | 是 | tuple() | v = () 或 v = tuple() |
set | 是 | 否 | 可哈希 | 否 | set() | v = set() |
练习题
1. 写代码实现
# 循环提示用户输入,如果输入值在v1中存在,则追加到v2中,如果v1中不存在,则添加到v1中。(如果输入x或n则停止循环)
v1 = {'AA', 'BB', 'CC'}
v2 = []
while True:
name = input("请输入姓名:")
if name in v1:
v2.append(name)
elif name.upper() == "N":
print(v1)
print(v2)
print("ending")
break
else:
v1.add(name)
2.下面哪些值不能做集合的元素
[11,22,33]#不能
[]#不能
(123)
(1,2,3)#不能
3.模拟用户信息录入程序,已录入则不再创建。
user_info_set = set()
while True:
name = input("请输入姓名:")
age = input("请输入年龄:")
item = (name, age,)
if item in user_info_set:
print("该用户已录入")
else:
user_info_set.add(item)
4.给列表去重
v1 = [11,22,33,4,55,11,22,55,5,4]
v2 = set(v1)
print(v2)
#{33, 4, 5, 11, 22, 55}
None 类型
Python的数据类型中有一个特殊的值None,意味着这个值啥都不是或表示空。相当于其他语言中 nu11
作用一样。在一定程度上可以帮助我们去节省内存。例如:
v1 = None
v3 = []
v4 = []
v3 = [11,22,33,44]
v4 = [111,22,43]
目前所有转可以换为False布尔值的值有:
0
""
[] or list()
() or tuple()
set()
None