Python的组合数据类型-集合

集合

Python 提供了两种内置的集合类型:可变的 set 类型,固定的 frozenset 类型。

  • 可变集合(set):可添加和删除元素,非可哈希的,不能用作字典的键,也不能做其他集合的元素。

  • 不可变集合(frozenset):与上面恰恰相反。

只有可哈希运算的对象可以添加到集合中,所有内置固定数据类型(比如 floatfrozensetintstrtuple )都是可哈希运算的,都可以添加到集合中。内置的可变数据类型(比如 dictlistset )都不是可哈希运算的,因为其哈希值会随着包含项数的变化而变化,因此这些数据类型不能添加到集合中。

集合的作用

集合是一个无序的,不重复的数据组合,它的主要作用是去重,把一个列表变成集合,就自动去重了:

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'}

另外,使用集合还可以进行快速的成员关系测试,测试两组数据之前的交集、差集、并集等关系。

集合对象是一组无序排列的可哈希的值,集合成员可以作为字典的键。

集合的相关操作

创建

集合没有自己的语法格式,只能通过集合的方法 set()frozenset() 创建。

1
2
3
4
5
6
7
8
9
>>> s1 = set('Tom')
>>> s2= frozenset('Jerry')
>>>
>>> print(s1,type(s1))
{'m', 'o', 'T'} <class 'set'>
>>>
>>> print(s2,type(s2))
frozenset({'J', 'r', 'y', 'e'}) <class 'frozenset'>
>>>

访问

由于集合本身是无序的,所以不能为集合创建索引或切片操作,只能循环遍历或使用 innot in 来访问或判断集合元素。

1
2
3
4
5
6
7
8
9
>>> s1 = set(['Tom','Jerry'])
>>> print('Tom' in s1)
True
>>> for i in s1:
... print(i)
...
Tom
Jerry
>>>

更新

可使用以下内建方法来更新:

1
2
3
4
5
s.add()
# 将传入的参数当成一个整体放进集合
s.update()
# 将传入的参数拆散放进集合
s.remove()

需要注意的是只有可变集合才能更新:

1
2
3
4
5
6
7
8
9
10
11
>>> s1 = set('Tom and Jerry')
>>> s1.add(' Dog ')
>>> print(s1)
{'a', 'd', 'm', 'r', 'o', 'J', ' Dog ', 'y', ' ', 'T', 'e', 'n'}
>>> s1.remove(' Dog ')
>>> s1.remove('r')
>>> print(s1)
{'a', 'd', 'm', 'o', 'J', 'y', ' ', 'T', 'e', 'n'}
>>> s1.update('Pig')
>>> print(s1)
{'a', 'd', 'm', 'o', 'J', 'g', 'y', ' ', 'T', 'i', 'e', 'n', 'P'}

删除

del:删除集合本身。

集合类型操作符 

成员关系 in ,not in。集合等价与不等价( ==, !=)。子集、超集(<, >)。

1
2
3
4
5
6
7
8
>>> s1 = set('Tom and Jerry')
>>> s2 = set('Jerry and Tom')
>>> print('T' in s1)
True
>>> print(s1 < s2)
False
>>> print(s1 == s2)
True

联合(|):与集合的 or 等价的,联合符号的等价方法是 union()

1
2
3
4
5
6
7
>>> s1=set('Tom')
>>> s2=set('Jerry')
>>> s3=s1|s2
>>> print(s3)
{'r', 'm', 'y', 'o', 'T', 'J', 'e'}
>>> print(s1.union(s2))
{'r', 'm', 'y', 'o', 'T', 'J', 'e'}

交集(&):与集合的 and 等价,交集符号的等价方法是 intersection()

1
2
3
4
5
6
7
8
>>> s1=set('abc')
>>> s2=set('cde')
>>> s3=s1&s2
>>> s3
{'c'}
>>> print(s1.intersection(s2))
{'c'}
>>>

差集(-):等价方法是 difference()

1
2
3
4
5
6
7
8
>>> s1=set('abc')
>>> s2=set('cde')
>>> s3=s1-s2
>>> s3
{'a', 'b'}
>>> print(s1.difference(s2))
{'a', 'b'}
>>>

对称差集(^):对称差分是集合的 XOR (‘异或’),取得的元素属于 s1,s2 但不同时属于 s1和 s2 ,其等价方法 symmetric_difference()

1
2
3
4
5
6
7
8
>>> s1=set('abc')
>>> s2=set('cde')
>>> s3=s1^s2
>>> s3
{'a', 'd', 'b', 'e'}
>>> print(s1.symmetric_difference(s2))
{'a', 'd', 'b', 'e'}
>>>

应用

最简单的去重方式

1
2
3
4
>>> x = [1,2,3,4,1,2,3,4]
>>> print(list(set(x)))
[1, 2, 3, 4]
>>>
有钱任性,请我吃包辣条
0%