4.6 集合(set)

集合是由不重复元素组成的无序容器。集合中的元素不能重复,即使向集合中再添加同样的元素,也只会保留一个。由于集合的这种特性,所以一般可以用集合进行去重。
集合中不能添加可变对象(不可哈希),因为无法判断两个可变对象是否相同,也就无法保证集合的内部不会有重复元素。
集合中的元素是无序的,我们通过print可以显示集合内的元素,但是显示的结果并非是集合中的元素的顺序。这意味着集合不能通过索引或切片获取内部的元素。

4.6.1 集合的创建

4.6.1.1 通过集合标识符号创建

列表在创建的时候用{}做标识。内部的元素用逗号进行分隔。
>>> st = {1} # 仅一个元素的集合
>>> st2 = {‘a’, ‘b’, ‘c’} # 集合中存放的全是字符
>>> st3 = {1, ‘a’, ‘中’} # 集合中存放混合数据
>>> st4 = {‘red’, ‘green’, ‘blue’} # 集合中存放的全是字符串

4.6.1.2 通过集合推导式创建

>>> {x for x in range(5)}

{0, 1, 2, 3, 4}

>>> {x * x for x in range(10)}

{0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

>>> {x*x for x in range(10) if x % 3 == 0}

{0, 9, 36, 81}

4.6.1.3 通过set函数创建

set函数可以将一个可迭代对象转换成集合。如果可迭代对象中有重复的元素则会自动去除保留一个。
>>> print(set(‘Pythonn’)) # 只会保留一个n

{‘P’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’}
>>> set() # 创建空的集合
{}

注意:不能通过st = {}创建空集合,因为这样会创建空的字典。

4.6.1.4 通过frozenset函数创建

set函数可以创建一个普通的集合(可以修改),但是通过frozenset函数创建的集合是一个不可修改的集合,创建后就不能再修改里面的元素,包括增加、删除、清空等。
>>> st = frozenset(‘python’)
>>> st

frozenset({‘o’, ‘t’, ‘p’, ‘h’, ‘y’, ‘n’})

>>> st.add(‘l’)

Traceback (most recent call last):
File “C:\Program Files\Python3102\lib\code.py”, line 90, in runcode
exec(code, self.locals)
File “”, line 1, in
AttributeError: ‘frozenset’ object has no attribute ‘add’

4.6.2 集合的访问

4.6.2.1 遍历集合

参见可迭代对象章节中的可迭代对象的遍历

4.6.2.2 成员资格检查

参见可迭代对象中的成员资格检查

4.6.3 集合的运算

4.6.3.1 并集(返回两个集合所有的元素的集合)

>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1 | st2

{1, 2, 3, 4, 5, 6, 8, 10}

4.6.3.2 交集(返回两个集合都有的元素的集合)

>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1 & st2

{2, 4}

4.6.3.3 差集(返回前者集合有而后者没有的元素的集合)

>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1 – st2

{1, 3, 5}

4.6.3.4 对称差(返回不同时在2个集合中的元素的集合)

>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1 – st2

{1, 3, 5, 6, 8, 10}

4.6.4 集合的关系

A < B # 返回A是否是B的子集(同:A.issubset(B))
A > B # 返回A是否是B的超集(同:A.issuperset(B))

4.6.5 集合的方法

4.6.5.1 添加元素

4.6.5.1.1 add(x)

描述
为集合添加元素
示例
>>> st = {1, 2}
>>> st.add(3)
>>> st

{1, 2, 3}

4.6.5.1.2 update(x)

描述
添加新的元素或集合到当前集合中。
示例
>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1.update(st2)
>>> st1

{1, 2, 3, 4, 5, 6, 8, 10}

4.6.5.2 删除元素

4.6.5.2.1 remove(x)

描述
指定删除集合中的元素。要删除的元素必须在目标集合中存在,否则引发KeyError异常。
示例
>>> st1 = {1, 2, 3}
>>> st1.remove(2)
>>> st1

{1, 3}

4.6.5.2.2 discard()

描述
删除集合中指定的元素。如果要删除的元素不在目标集合中则不起任何作用。
示例
>>> st1 = {1, 2, 3, 4, 5}
>>> st1.discard(2)
>>> st1

{1, 3, 4, 5}

4.6.5.2.3 pop()

描述
随机删除集合中的一个元素
示例
>>> st1 = {1, 2, 3}
>>> st1.pop()

1

>>> st1

{2, 3}

4.6.5.2.4 clear()

描述
移除集合中的所有元素
示例
>>> st = {1, 2}
>>> st.clear()
>>> st

{}

4.6.5.3 查询统计类

4.6.5.3.1 union(x)

描述
返回两个集合的并集。
示例
>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1.union(st2)

{1, 2, 3, 4, 5, 6, 8, 10}

4.6.5.3.2 intersection()、intersection_update()

描述
返回多个集合的交集。intersection不修改原对象内容,直接返回结果,而intersection_update会修改原对象内容。
示例
>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1.intersection(st2)

{2, 4}

4.6.5.3.3 difference()、difference_update()

描述
返回多个集合的差集。difference不修改原对象内容,直接返回结果,而difference_update会修改原对象内容。
示例
>>> st1 = {1, 2, 3}
>>> st2 = {2, 4, 6}
>>> st1.difference(st2)

{1, 3}

4.6.5.3.4 symmetric_difference()、symmetric_difference_update()

描述
返回两个集合中不重复的元素的集合(对称差)。symmetric_difference不修改原对象内容,直接返回结果,而symmetric_difference_update会修改原对象内容。
示例
>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1.symmetric_difference(st2)

{1, 3, 5, 6, 8, 10}

4.6.5.3.5 issubset()、issuperset()

描述
判断前者集合是否是后者集合的子集(超集),如果为真,则返回True,否则返回False。
示例
>>> st1 = {1, 2}
>>> st2 = {1, 2, 4}
>>> st1.issubset(st2)

True

4.6.5.3.6 isdisjoint()

描述
判断两个集合是否不相交(即不含有相同元素),如果不相交则返回True,否则返回False。
示例
>>> st1 = {1, 2}
>>> st2 = {2, 4}
>>> st3 = {3, 6}
>>> st1.isdisjoint(st2)
>>> st1.isdisjoint(st3)

False
True

4.6.5.4 其它类

4.6.5.4.1 copy()

描述
拷贝一个集合
示例
>>> st = {1, 2, 3}
>>> st2 = st.copy()
>>> st2

{1, 2, 3}