集合(set)是一个 无序 、可变、不允许数据重复的容器。
1.定义
s = {11,22,33}
无序,无法通过索引取值
可变,可以添加和删除元素
不允许数据重复
用途:如果有一个数据类型不允许重复,那么此时应该用集合
注意: 定义空集合v = set() 而非 v = {}, v={}默认未定义字典
v1 = [] 等同 v1 = list()
v2 = () 等同v2 = tuple()
v3 = set()
v4 = {} 等同v4 = dict()
2.独有功能
s = {11,22,33}
2.1 添加元素 add()
s.add('sss') # {11,22,33, 'sss'}
2.2 删除元素 discard()
s.discard(33) # {11,22,'sss'}
2.3 交集 intersection() 或者 &
s1 = {11,22,33}
s2 = {33,44,55}
s1.intersection(s2) # {33}
s1 & s2 # {33}
2.4 并集 union() 或者 |
s1 = {11,22,33}
s2 = {33,44,55}
s1.union(s2) # {11,22,33,44,55}
s1 | s2 # {11,22,33,44,55}
2.5 差集 difference() 或者 -
s1 = {11,22,33}
s2 = {33,44,55}
s1.difference(s2) # {11,22}
s2 - s1 # {44,55}
2.公共功能
2.1 减 计算差集(-)
2.2 计算交集(&)
2.3 计算并集(|)
2.4 计算长度(len(s))
2.5 for循环 for char in s
3.转换
其他类型如果想要转换为集合类型,可以通过set进行转换,并且如果数据有重复自动剔除。
提示:int/list/tuple/dict都可以转换为集合。
提示:这其实也是去重的一个手段。
4.存储原理
4.1集合的存储原理
s1 = set()
s1.add('流年')
第一步:利用哈希函数将字符串'流年'转化为一个数值,例如24
第二步:取余数(实际掩码&运算) 24%7 = 3
第三步:将字符串'流年'放在哈希表3的索引位置
4.2集合的元素必须可哈希
因存储原理,集合的元素必须是可哈希的值,即:内部通过通过哈希函数把值转换成一个数字。
目前可哈希的数据类型(元素指定的是集合的每个子元素):int、bool、str、tuple,而list、set、dict是不可哈希的。
总结:集合的元素只能是 int、bool、str、tuple 。
集合转化:
v1 = [11,22,33]
v2 = set(v1) # {11,22,33} # 转化成功
v3 = [11,[2,3],44]
v4 = set(v3) # 报错
注意:由于集合的可哈希存储,所以集合遍历的查找效率特别高(比起for遍历list,tuple,dict)
4.3对比和嵌
类型 | 是否可变 | 是否有序 | 元素要求 | 是否可哈希 | 转换 | 定义空 |
---|---|---|---|---|---|---|
list | 是 | 是 | 无 | 否 | list(其他) | v=[]或v=list() |
tuple | 否 | 是 | 无 | 是 | tuple(其他) | v=()或v=tuple() |
set | 是 | 否 | 可哈希 | 否 | set(其他) | v=set() |
注意:由于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}