原文链接: http://www.juzicode.com/archives/337
1 set的定义
dict,list,tuple的定义方法把大中小括号用完了,创建一个空的set就只能用set()了:
>>> s = set() >>> type(s) <class ‘set’> |
当然还有一种创建包含了元素的set,仍然可以使用大括号{}来初始化,这时候解释器会根据{} 内部的组织形式自动推导为set还是dict。
>>> s={1:10,2:20,3:30} >>> type(s) <class ‘dict’> #逗号分隔的是一组冒号隔开的数据,所以解释器推导为字典。 >>> s={1,2,3} >>> type(s) <class ‘set’>#逗号分隔的是单个的数据,所以解释器推导为集合 |
2 set的元素类型
直接上代码实验:
>>> s = {1,2,3} >>> print(s) {1, 2, 3} >>> s = {1.1, 2.2 ,3.3} >>> print(s) {1.1, 2.2, 3.3} >>> s = {‘juzicode’,’桔子code’} >>> print(s) {‘桔子code’, ‘juzicode’} >>> s = {(1,2,3),(4,5,6)} >>> print(s) {(1, 2, 3), (4, 5, 6)} >>> s ={[1,2,3],[4,5,6]} Traceback (most recent call last): File “<stdin>”, line 1, in <module> TypeError: unhashable type: ‘list’ >>> s = { {‘a’:1,’b’:2} } Traceback (most recent call last): File “<stdin>”, line 1, in <module> TypeError: unhashable type: ‘dict’ |
从实验结果看,set的元素类型不能是list和dict,因为他们是unhashable类型的数据,这和字典的key类型的要求是一样的。
【实验】定义一个set a,将这个a作为一个元素放到set b中,看下是什么结果?
3 计算长度len(s)
计算长度和str,list,tuple,dict一样,使用len()计算set的长度:
>>> s={1,2,3} >>> len(s)3 |
4 添加/删除元素
s.add(x):往set中增加x元素,如果x已经存在,set不会发生变化,如果x不存在,set元素增加x;
s.remove(x):删除set中x元素,如果x不存在,则抛异常;
s.pop():随机删除一个元素,注意括号中是没有数据的。
s1.update(s2):s2的元素拆成单个后往s1中添加,类似list的extend()
源码 | print(‘—–欢迎来到www.juzicode.com’) print(‘—–公众号: juzicode/桔子code\n’) print(‘set实验:添加删除元素’) s={1,2,3} print(‘初始s: ‘,s) s.add(1) print(‘add(1)后的set: ‘,s) s.add(4) print(‘add(4)后的set: ‘,s) s.remove(1) print(‘remove(1)后的set: ‘,s) #s.remove(5) #print(‘remove(5)后的set: ‘,s) s.pop()print(‘pop()后的set: ‘,s) s.pop()print(‘pop()后的set: ‘,s) s.update({7,8,9}) print(‘update(7,8,9)后的set: ‘,s) |
结果 | —–欢迎来到www.juzicode.com —–公众号: juzicode/桔子code set实验:添加删除元素初始 s: {1, 2, 3} add(1)后的set: {1, 2, 3} add(4)后的set: {1, 2, 3, 4} remove(1)后的set: {2, 3, 4} pop()后的set: {3, 4} pop()后的set: {4} update(7,8,9)后的set: {4, 7, 8, 9} |
5 并集/差集/交集
既然是集合,就会存在求并集、差集和交集的操作:
s1.difference(s2):计算s1有s2没有的元素;
s1.union(s2):计算s1和s2的并集,如果有元素重叠,只保留一个元素;
s1.intersection(s2):计算s1和s2的交集;
s1.symmetric_difference(s2):计算s1和s2的对称差集,对称差集就是2个集合的并集减交集;
源码 | s1={1,2,3,4,5} s2={4,5,6} print(‘初始s1: ‘,s1) print(‘初始s2: ‘,s2) sd = s1.difference(s2) print(‘s1和s2的差集: ‘,sd) su = s1.union(s2) print(‘s1和s2的并集: ‘,su) si = s1.intersection(s2) print(‘s1和s2的交集: ‘,si) ssd = s1.symmetric_difference(s2) print(‘s1和s2的对称差集: ‘,ssd) |
结果 | 初始s1: {1, 2, 3, 4, 5} 初始s2: {4, 5, 6} s1和s2的差集: {1, 2, 3} s1和s2的并集: {1, 2, 3, 4, 5, 6} #重复元素只保留同一个 s1和s2的交集: {4, 5} |
计算差、并、交、对称差集还可以使用符号来完成,上面例程中利用符号计算的结果是:
源码 | print(‘s1-s2: ‘,s1-s2) #差集 print(‘s1|s2: ‘, s1|s2) #并集 print(‘s1&s2: ‘, s1&s2) #交集 print(‘s1^s2: ‘, s1^s2) #对称差集 |
结果 | s1-s2: {1, 2, 3} s1|s2: {1, 2, 3, 4, 5, 6} s1&s2: {4, 5} s1^s2 : {1, 2, 3, 6} |
计算并集是不是也可以用加号,答案却是否定的,set不支持用加号进行求并集操作。
print(‘s1+s2: ‘,s1+s2) TypeError: unsupported operand type(s) for +: ‘set’ and ‘set’ |
6 判断
s1.isdisjoint(s2):s1和s2的元素是否都不相同,如果不相同返回True;
s1.issubset(s2):s1是否是s2的子集
s1.issubset(s2):s1是否是s2的超集
源码 | s1={1,2,3} s2={1,2,3,4,5,6} print(‘初始s1: ‘,s1) print(‘初始s2: ‘,s2) print(‘s1和s2元素都不一样: ‘,s1.isdisjoint(s2)) print(‘s1是否是s2的子集: ‘,s1.issubset(s2)) print(‘s1是否是s2的超集: ‘,s1.issuperset(s2)) |
结果 | —–欢迎来到www.juzicode.com—–公众号: juzicode/桔子code 初始s1: {1, 2, 3} 初始s2: {1, 2, 3, 4, 5, 6} s1和s2元素都不一样: False s1是否是s2的子集: True s1是否是s2的超集: False |