集合set
思维导图:
集合的引入:
- python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(并), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算.
- 当要去除列表中的重复元素时,可将他们转换成集合,然后再转化成列表。
集合的定义
- 集合的创建集合是一个无序不重复元素的集
- 不可变的数据类型一定可哈希;hash()内置函数可以判断某个类型是否可哈希;
s={int | str | tuple | float | long }
必须为不可变数据类型!
列表和字典都是可变的,可变是指改变值时,改变的是id中的值,而不是指向所改变值的id。
集合的函数:
集合的关系测试
- s.intersection(s1[,..]) ##交集,不改变s
(s & s1 & …..) - s.intersection_update(s1[,..]) ##交集,改变s
- s.union(s1[,…]) ##并集,不改变s
(s | s1 | ….) - s.difference(s1[,..]) ##差集,不改变s
(s-s1) - s.difference_update(s1[,..]) ##差集,改变s
- s.symmetric_difference(s1) ##对等差分,两个差集的并
(s ^ s1) - s.symmetric_difference_update(s1) ##对等差分,改变s
- s.isdisjoint(s1) ##s和s1是否没有交集,有,返回False,无,返回True
- s.issubset(s1) ##s是否为s1的子集,返回bool
- s.issuperset(s1) ##s是否为s1的父集,返回bool
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = {1, 2}
s4 = {5}
print "s1,s2,s3的交集:", s1.intersection(s2, s3)
print "s1,s2,s3的交集:", s1 & s2 & s3
print "s1,s2,s3的并集:", s1.union(s2, s3)
print "s1,s2,s3的并集:", s1 | s2 | s3
print "s1-s2的差集:", s1.difference(s2)
print "s1-s2的差集:", s1 - s2
print "s1-s2-s3的差集:", s1.difference(s2, s3)
print "s1-s2-s3的差集:", s1 - s2 - s3
print "s2-s1的差集:", s2.difference(s1)
print "s1和s2的对等差分:", s1.symmetric_difference(s2)
print "s1和s2的对等差分:", s1 ^ s2
print "s2和s1的对等差分:", s2.symmetric_difference(s1)
# s.isdisjoint(s2) 如果有交集,返回False;否则,返回True;
print "s1和s4是否没有交集:", s1.isdisjoint(s4)
print "s3是否为s1的子集:", s3.issubset(s1)
print "s1是否为s3的父集:", s1.issuperset(s3)
集合的增删改查:
- len(s) # set 的长度
- x in s # 测试 x 是否是 s 的成员
- 增加:
s.add(1) ##添加元素1至s(1个元素)
s.update(s1) ##将集合|列表|元组s1元素添加至s - 删除:
s.remove(1), # 删除存在的元素1,如果不存在,直接报错;
s.discard(1) # 删除存在的元素1,如果不存在,do nothing;
s.pop(), # 随即删除集合元素,不加任何参数; - 复制: s1 = s.copy() #s和s1的id不同
- 清空: s.clear()
- 删除:del(s)
冻集(frozenset)
- 冻住的集合,不能增删改;
- frozenset(set)
- set(frozenset)