然而,由于集合是无序的,并且不会把键匹配到值,它们既不是序列也不是映射类型,它们是自成一体的类型。
========================================================================================
要创建一个集合对象,向内置的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>> 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 "", line 1, in
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({})
列表和字典不能嵌入到集合中,但是,如果你需要存储复合值的话,元组是可以嵌入的。
========================================================================================
集合解析
>>> {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]
当你遍历图形或其他回环结构的时候,集合可以用来记录已经访问过的位置,必须确保访问过的项不再循环。尽管把访问状态作为键记录到字典中很高效,但集合提供了几乎等同的一种替代方式。
其次,在处理较大的数据集合的时候(例如:数据库查询结果),两个集合的交集包含了两个领域中的共有的对象,并集包含了两个集合的所有项目。