八 集合(set)
集合是一个无序的,不重复的数据组合,它的主要作用如下:
- 去重,把一个列表变成集合,就自动去重了
- 关系测试,测试两组数据之前的交集、差集、并集等关系
集合(set):把不同的元素组成一起形成集合,是python基本的数据类型。
集合元素(set elements):组成集合的成员(不可重复)
1
2
3
4
5
6
7
|
li = [ 1 , 2 , 'a' , 'b' ] s = set (li) print (s) # {1, 2, 'a', 'b'} li2 = [ 1 , 2 , 1 , 'a' , 'a' ] s = set (li2) print (s) #{1, 2, 'a'} |
集合对象是一组无序排列的可哈希的值:集合成员可以做字典的键
1
2
3
|
li = [[ 1 , 2 ], 'a' , 'b' ] s = set (li) #TypeError: unhashable type: 'list' print (s) |
集合分类:可变集合、不可变集合
可变集合(set):可添加和删除元素,非可哈希的,不能用作字典的键,也不能做其他集合的元素
不可变集合(frozenset):与上面恰恰相反
1
2
3
|
li = [ 1 , 'a' , 'b' ] s = set (li) dic = {s: '123' } #TypeError: unhashable type: 'set' |
集合的相关操作
1、创建集合
由于集合没有自己的语法格式,只能通过集合的工厂方法set()和frozenset()创建
1
2
3
4
5
6
|
s1 = set ( 'alvin' ) s2 = frozenset ( 'yuan' ) print (s1, type (s1)) #{'l', 'v', 'i', 'a', 'n'} <class 'set'> print (s2, type (s2)) #frozenset({'n', 'y', 'a', 'u'}) <class 'frozenset'> |
2、访问集合
由于集合本身是无序的,所以不能为集合创建索引或切片操作,只能循环遍历或使用in、not in来访问或判断集合元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
s1 = set ( 'alvin' ) print ( 'a' in s1) print ( 'b' in s1) #s1[1] #TypeError: 'set' object does not support indexing for i in s1: print (i) # # True # False # v # n # l # i # a |
3、更新集合
可使用以下内建方法来更新:
s.add()
s.update()
s.remove()
注意只有可变集合才能更新:
1
2
3
4
5
6
7
8
9
10
11
12
|
# s1 = frozenset('alvin') # s1.add(0) #AttributeError: 'frozenset' object has no attribute 'add' s2 = set ( 'alvin' ) s2.add( 'mm' ) print (s2) #{'mm', 'l', 'n', 'a', 'i', 'v'} s2.update( 'HO' ) #添加多个元素 print (s2) #{'mm', 'l', 'n', 'a', 'i', 'H', 'O', 'v'} s2.remove( 'l' ) print (s2) #{'mm', 'n', 'a', 'i', 'H', 'O', 'v'} |
del:删除集合本身
四、集合类型操作符
1 in ,not in
2 集合等价与不等价(==, !=)
3 子集、超集
1
2
3
4
|
s = set ( 'alvinyuan' ) s1 = set ( 'alvin' ) print ( 'v' in s) print (s1<s) |
4 联合(|)
联合(union)操作与集合的or操作其实等价的,联合符号有个等价的方法,union()。
1
2
3
4
5
|
s1 = set ( 'alvin' ) s2 = set ( 'yuan' ) s3 = s1|s2 print (s3) #{'a', 'l', 'i', 'n', 'y', 'v', 'u'} print (s1.union(s2)) #{'a', 'l', 'i', 'n', 'y', 'v', 'u'} |
5、交集(&)
与集合and等价,交集符号的等价方法是intersection()
1
2
3
4
5
6
|
s1 = set ( 'alvin' ) s2 = set ( 'yuan' ) s3 = s1&s2 print (s3) #{'n', 'a'} print (s1.intersection(s2)) #{'n', 'a'} |
6、查集(-)
等价方法是difference()
1
2
3
4
5
6
|
s1 = set ( 'alvin' ) s2 = set ( 'yuan' ) s3 = s1 - s2 print (s3) #{'v', 'i', 'l'} print (s1.difference(s2)) #{'v', 'i', 'l'} |
7、对称差集(^)
对称差分是集合的XOR(‘异或’),取得的元素属于s1,s2但不同时属于s1和s2.其等价方法symmetric_difference()
1
2
3
4
5
6
|
s1 = set ( 'alvin' ) s2 = set ( 'yuan' ) s3 = s1^s2 print (s3) #{'l', 'v', 'y', 'u', 'i'} print (s1.symmetric_difference(s2)) #{'l', 'v', 'y', 'u', 'i'} |
应用
'''最简单的去重方式''' lis = [1,2,3,4,1,2,3,4] print list(set(lis)) #[1, 2, 3, 4]