集合
python中的集合(set)是由一些唯一的、不可变的对象组成的无序集合体,集合支持与数学集合中相对应的操作,一个元素在集合中只能出现一次,无论它被添加了多少次。
集合是可迭代对象(iterable
),可以按需增长或缩短,并且可以包含多种对象类型,集合很像一个有键无值的字典,但由于集合是无序的,因此集合既不是序列(sequence
)也不是映射类型(mapping
)。
1. 创建集合对象
要创建一个集合对象,可以向内置的set函数传入一个序列或者其他可迭代对象:
>>> x = set('abcde')
>>> y = set('bdxyz')
>>> x
{'a', 'd', 'e', 'b', 'c'}
>>> y
{'d', 'b', 'z', 'x', 'y'}
python3开始引入了新的集合字面量,可以使用集合字面量的形式(花括号)来创建一个集合对象:
>>> set([1, 2, 3, 4])
{1, 2, 3, 4}
>>> {1, 2, 3, 4}
{1, 2, 3, 4}
>>> type({1, 2, 3, 4})
<class 'set'>
但创建空的集合对象还是需要使用set函数:
>>> type({}) # {}表示是空字典,等同于dict()
<class 'dict'>
>>> type({1})
<class 'set'>
>>> set() # set()才表示是空集合
set()
2. 集合运算符
集合通过表达式运算符可以支持常用的集合的数学运算:
>>> x - y # 差集
{'e', 'a', 'c'}
>>> x | y # 并集
{'a', 'y', 'd', 'e', 'b', 'z', 'x', 'c'}
>>> x & y # 交集
{'b', 'd'}
>>> x > y, x < y # 超集判断、子集判断
(False, False)
集合支持成员运算符,可使用成员运算符in
进行成员测试:
>>> 'e' in x
True
3. 集合操作
除了运算符,集合对象还定义了与这些运算符操作相对应的方法:
>>> x.difference(y) # 差集,相当于x - y
{'a', 'e', 'c'}
>>> x.union(y) # 并集,相当于x | y
{'d', 'x', 'a', 'y', 'b', 'c', 'e', 'z'}
>>> x.intersection(y) # 交集,相当于x & y
{'b', 'd'}
>>> x.issuperset(y) # 超集判断,相当于x > y
False
>>> x.issubset(y) # 子集判断,相当于x < y
False
集合的修改操作:
add
:添加一个元素到集合中update
:添加多个元素到原集合中,相当于在原集合的基础上求并集remove
:移除集合中的一个指定元素clear
:清空集合
>>> z = set('bd')
>>> z
{'b', 'd'}
>>> z.add('SPAM')
>>> z
{'b', 'SPAM', 'd'}
>>> z.update(set(['x', 'y']))
>>> z
{'b', 'SPAM', 'd', 'x', 'y'}
>>> z.remove('b')
>>> z
{'SPAM', 'd', 'x', 'y'}
>>> z.clear()
>>> z
set()
4. 集合是可迭代对象
集合是可迭代的容器,因此集合可以用于len、for循环和列表推导的操作中,但集合并不是序列因此不支持索引和分片操作。
>>> len(set('abc'))
3
>>> for item in set('abc'):
... print(item * 3)
...
bbb
ccc
aaa
5. 集合的不可变性
集合中只能包含不可变的(hashable)对象类型,因此列表和字典不能作为元素被嵌入到集合中,而元组则可以嵌入集合中。
>>> s = {0}
>>> s.add([1, 2, 3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> s.add({'a': 1})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> s.add((1, 2, 3))
>>> s
{0, (1, 2, 3)}
>>> (1, 2, 3) in s
True
集合本身也是可变的,因此不能把一个集合嵌入到另一个集合中。
>>> s.add({1, 2, 3})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
如果想要将一个集合嵌入到另一个集合中,可以调用内置函数frozenset
,frozenset函数会创建一个不可变的集合,该集合不可修改,并且可以嵌入到其它集合中。
>>> f = frozenset({1, 2, 3})
>>> f
frozenset({1, 2, 3})
>>> s.add(f)
>>> s
{0, (1, 2, 3), frozenset({1, 2, 3})}
6. 集合推导
python3中还引入了集合推导构造。集合推导编写在花括号中,在花括号中指定一个表达式,表达式后跟着for循环来遍历可迭代对象,根据表达式的结果迭代生成集合的元素。
>>> {x for x in 'spam'}
{'p', 's', 'm', 'a'}
# 集合推导中可以使用if语句进行过滤
>>> {x for x in 'spam' if x != 'a'}
{'p', 'm', 's'}
# 集合推导还可以使用多个循环
>>> X = {1, 2, 3}
>>> Y = {4, 5, 6}
>>> {x - y for x in X for y in Y}
{-1, -5, -4, -3, -2}
7. 集合常见用途
- 由于集合中同一元素只能有一个,因此集合可以用于过滤可迭代对象中的重复项(虽然元素顺序可能会重新排列)——将可迭代对象转换为集合,之后再转换回去。
>>> L = [1, 2, 1, 3, 2, 4, 5]
>>> set(L)
{1, 2, 3, 4, 5}
>>> L = list(set(L))
>>> L
[1, 2, 3, 4, 5]
- 集合可以用于提取列表、字符串以及其他可迭代对象中的差异——将可迭代对象转换为集合,之后求差集。
# 比较bytes对象类型和bytearray对象类型的属性列表差异
>>> set(dir(bytes)) - set(dir(bytearray))
{'__getnewargs__'}
- 由于集合是无序的,因此可以借助集合进行顺序无关的相等性测试。
>>> L1, L2 = [1, 3, 5, 2, 4], [2, 5, 3, 4, 1]
>>> L1 == L2
False
>>> set(L1) == set(L2)
True
标签:set,迭代,Python,运算符,对象,add,集合
From: https://www.cnblogs.com/N1rv2na/p/18052228