然而,由于集合是无序的,并且不会把键匹配到值,它们既不是序列也不是映射类型,它们是自成一体的类型。
=====================================================
要创建一个集合对象,向内置的set函数传递一个序列或其他可迭代的对象:
>>> x = set('abcde') >>> y = set('bdxyz')得到了一个集合对象,其中包含传递的对象的所有元素(注意,集合并不包含位置顺序,序列却包含):
>>> x {'b', 'c', 'd', 'a', 'e'} >>> y {'b', 'd', 'x', 'y', 'z'}集合通过表达式操作符支持一般的数学几何运算。注意,不能再一般序列上应用这些表达式,必须通过序列创建集合后才能使用这些工具。
>>> 'e' in x True >>> x - y {'c', 'a', 'e'} >>> x | y {'a', 'b', 'd', 'e', 'x', 'y', 'c', 'z'} >>> x&y {'b', 'd'} >>> x^y #集合对称差:x和y的并集减去交集 {'a', 'e', 'x', 'y', 'c', 'z'} >>> x>y # y是否是x的子集 False >>> x<y # x是否是y的子集 False >>> x == y False除了表达式,集合对象还提供了对应这些操作的方法:add方法插入,update是按位置求并集,remove根据值删除一个项目
>>> z = x&y >>> z {'b', 'd'} >>> z.add('SPAM') >>> z {'b', 'SPAM', 'd'} >>> z.update(set(['X','Y'])) >>> z {'b', 'SPAM', 'X', 'd', 'Y'} >>> z.remove('b') >>> z {'SPAM', 'X', 'd', 'Y'}作为可迭代的容器,集合也可以用于len、for循环和列表解析这样的操作中。然而,由于它们都是无序的,所以不支持像索引和分片这样的操作:
>>> for item in set('abc'): print(item*3) bbb ccc aaa尽管前面介绍的集合表达式通常需要两个集合,它们基于方法的对应形式往往对任何可迭代类型也有效:
>>> S = set([1,2,3]) >>> S {1, 2, 3} >>> S |set([3,4]) {1, 2, 3, 4} >>> S |([1,4]) Traceback (most recent call last): File "<pyshell#30>", line 1, in <module> S |([1,4]) TypeError: unsupported operand type(s) for |: 'set' and 'list' >>> S.union(([1,5])) {1, 2, 3, 5} >>> S.issubset(range(-5,5)) True注意:在python中,{}仍然是一个字典。空的集合必须通过内置函数set来创建,并且以同样方式显示:
>>> S-{1,2,3} set() >>> type({}) <class 'dict'>列表和字典不能嵌入到集合中,但是,如果你需要存储复合值的话,元组是可以嵌入的。
=====================================================
集合解析
>>> {c*4 for c in 'spams'} {'pppp', 'aaaa', 'mmmm', 'ssss'} >>> {x**2 for x in [1,2,3,4]} {16, 1, 9, 4}=====================================================
为什么使用集合:
集合的用途:例如,由于项在集合中只能存储一次,集合(set)可以用来把重复项从其他集合(collection)中过滤掉。直接把集合(collection)转换为一个集合(set),然后
再转换回来即可:
>>> 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]当你遍历图形或其他回环结构的时候,集合可以用来记录已经访问过的位置,必须确保访问过的项不再循环。尽管把访问状态作为键记录到字典中很高效,但集合提供了几乎等同的一种替代方式。
其次,在处理较大的数据集合的时候(例如:数据库查询结果),两个集合的交集包含了两个领域中的共有的对象,并集包含了两个集合的所有项目。