集合
集合是无序的对象集,它和字典一样使用花括号,但没有键值对的概念。集合属于可变的数据类型,一般用于保持序列的唯一性—— 也就是同样的元素仅出现一次。
在使用集合时一定要注意集合的“无序”和“唯一”两个特点,避免出错。
一、集合的创建
s = set() # 创建一个空集合 s1 = {} # 这是创建一个空字典,而非集合 print(type(s1)) # <class 'dict'> s2 = {2, 'hello', True, 3.14} # 创建四个元素的集合
集合的元素是唯一的,当集合出现不唯一的字符时,创建的集合中只会保存一个。
set1={1,2,3,3,4,2} print(set1) # {1, 2, 3, 4}
注意:布尔值True和False在底层分别是以1和0保存的,因此如果同时出现在集合中的时候,会去掉后面的值。
set2 = {3.14, True, 'Jack', 1, ''} # 去除1 print(set2) # {'', True, 3.14, 'Jack'}
二、添加元素
语法:s.add(x)
将元素X添加到集合S中,如果元素存在,则不进行任何操作。
s={'Jack','Rose',"Mery"} s.add('John') print(s) # {'Rose', 'Mery', 'John', 'Jack'}
三、删除元素
语法:s.pop()
随机删除集合里的一个元素。
s = {'Jack', 'Rose', "Mery"} s.pop() # 随机删除 print(s) # {'Rose', 'Jack'}
语法:s.remove(element)
删除集合里指定(element)的值,如值不存在,报错。
s = {'Jack', 'Rose', "Mery"} s.remove('Rose') print(s) # {'Mery', 'Jack'}
四、集合合并
语法:s.update(iterable)
将可迭代对象iterable拼接到s1里,去重。
s1 = {'Jack', 'Rose', "Mery"} s2={'Rose','john'} s1.update(s2) # 集合拼接 print(s1) # {'Rose', 'Jack', 'john', 'Mery'} l1=['Rose','john'] s1.update(l1) # 列表拼接 print(s1) # {'Rose', 'Jack', 'john', 'Mery'}
五、清空元素
将集合清空,留下一个空集合set()
s = {'Jack', 'Rose'} s.clear() print(s) # set()
六、集合运算
- set支持减法运算符(求set1和set2的差集,set1中有,set2中无)
- set支持&运算符(求set1和set2的交集,set1中有,set2中也有)
- set支持|运算符(求set1和set2的并集,set1有,或set2中有)
- set支持^运算符(求set1和set2的交集的补集)
- set不支持加法运算符
set1 = {1, 2, 3, 4, 5} set2 = {3, 4, 5, 6, 7} print(set1 - set2) # {1, 2} print(set1 & set2) # {3, 4, 5} print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7} print(set1 ^ set2) # {1, 2, 6, 7} print(set1 + set2) # TypeError
集合方法
合集:使用union()方法。(同|运算符)
print(set1.union(set2)) # {1, 2, 3, 4, 5, 6, 7}
交集:使用intersection()方法(同&运算符)
print(set1.intersection(set2)) # {3, 4, 5}
差集:使用difference()方法(同减号运算符)
print(set1.difference(set2)) # {1, 2}
七、集合存储原理
集合存储原理同字典存储原理相似,区别是字典里的键是可哈希,而集合里所有元素是可哈希,即内部通过哈希函数把值转换成一个数字。
v = hash('Jack') print(v) # 8690505197273509452 v1 = hash((11, 22, 33, 44)) print(v1) # 8386256510965472093
目前可哈希的数据类型:int、bool、str、tuple,而list、set是不可哈希的。
总结:集合的元素只能是int、bool、str、tuple。
- 转换成功
v1=[11,22,33,12,11,99] v2=set(v1) print(v2) #(11,22,33,12,11,99)
- 转换失败
v1=[11,22,['zhangsan','lisi'],33] v2=set(v1) #报错,元素是列表,不可哈希
集合在底层也采用哈希算法,因此集合的查找效率非常高(数据量大了才明显),原理在字典中叙述过,可以参考字典2。