集合也是容器,其内元素都是无序、惟1、不可变的。它经常使用来作成员测试、移除重复数据、数据计算(好比交集、并集、差集)。python
集合Set是dict的无value版。集合也使用大括号包围:函数
>>> s = {'a','b','c'} >>> type(s) <class 'set'>
Set中的元素和dict同样也是经过hash值来存储的:将元素hash()获得hash值,存储到Set中。因此,Set中的元素必须是不可变数据(例如列表不能放进集合中)。但集合自身是可变的,能够修改其中的元素。此外,python提供了另外一种不可变的集合类型frozenset。测试
使用大括号或set()构造方法能够构造集合。code
s = {'a','b','c'} s = set("abc") s = frozenset("abc")
须要注意的是,空的{}
表示的字典,而不是集合,若是想要构造空集合,可使用不带参数的set()来构造。索引
因为集合是经过hash值来存储的,没有位置索引。因此无法对集合进行单元素的检索,只能对集合进行修改操做,或迭代、遍历。rem
>>> x = set("abcde") >>> y = set("defgh") >>> z = set("opq") >>> x {'b', 'e', 'c', 'a', 'd'} >>> y {'e', 'h', 'f', 'g', 'd'}
集合的运算有交集、并集、差集等操做。它们都有两种方式:操做符号版的,方法函数版的。符号版的都只能集合对集合,函数版的能够集合和其它比较,好比列表。hash
交集&
或intersection()方法:io
>>> x & y {'e', 'd'} >>> x.intersection(y) {'e', 'd'} >>> x & ["a", "c"] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for &: 'set' and 'list' >>> x.intersection(["a","c"]) {'c', 'a'}
并集|
或union()方法:ast
>>> x | y {'b', 'e', 'h', 'c', 'a', 'f', 'g', 'd'} >>> x | y | z >>> x.union(y) >>> x.union(["x", "y"]) >>> x.union(["x", "y"], ["o", "p"])
差集-
或difference():class
>>> x-y {'c', 'a', 'b'} >>> y-x {'g', 'f', 'h'} >>> x.difference(y) {'c', 'a', 'b'} >>> y.difference(x) {'g', 'f', 'h'}
还有XOR操做,取集合一、集合2中非交集的部分:
>>> x ^ y {'f', 'a', 'h', 'b', 'c', 'g'} >>> x.symmetric_difference(y)
下面是测试两个集合之间是不是子集、真子集、超集的关系,s1和s2都是集合。一样,使用函数版的能够是其它类型。
# 子集 s1 <= s2 s1.issubset(s2) s1.issubset(other_type) # 真子集 s1 < s2 # 超集 s1 >= s2 s1.issuperset(s2) s1.issuperset(other_type) # 真超集 s1 > s2
s1.isdisjoint(other_type)
测试集合和另外一个数据容器(如集合、列表)是否存在相交数据。即集合中的元素和其它容器是否有共同数据,若是有则返回False,不然返回True。
>>> x.isdisjoint(y) False >>> x.isdisjoint(z) True >>> x.isdisjoint(list("ab")) False >>> x.isdisjoint(list("opq")) True
集合类型(不是frozenset)是可变的容器类型,能够修改它(但无法检索它)、测试、迭代它,但不能检索它(除非迭代、遍历)。
s1.add(elem)添加元素到集合s1中。由于集合中的元素都惟一,因此添加已存在的元素不会有任何效果,但也不会报错。
s1.remove(elem)移除集合s1中的元素。
s1.pop()随机移除一个元素并返回这个元素。
s1.clear()清空集合。
s1.discard(elem)移除已存在的某个元素,若是不存在则无视(返回None)。
s1.copy()拷贝(浅拷贝)集合s1。
len(s1)返回集合s1长度。
i in s1测试元素i是否在集合s1中。
除了这些基本操做外,还有基于集合运算的修改操做。
取得并集后覆盖集合s1:
s1.update(*others) s1 |= other |...
取得交集后覆盖集合s1:
s1.intersection_update(*others) s1 &= other & ...
取得差集后覆盖集合s1:
s1.difference_update(*others) s1 -= other |...
取得XOR运算后的结果覆盖集合s1:
s1.symmetric_difference_update(other) s1 ^= other
到目前为止,各类解析表达式的方式已经很清晰了。因此看示例便可:
>>> {x for x in 'abcde'} {'b', 'e', 'c', 'a', 'd'} >>> {c*2 for c in "abcde"} {'ee', 'bb', 'cc', 'dd', 'aa'}