Python核心数据类型——集合(Set)

来源:互联网 发布:淘宝吸黑头仪器有用吗 编辑:程序博客网 时间:2024/06/05 15:54
集合是一些唯一的,不可变的对象的一个无序集合,这些对象支持与数学几何理论相对应的操作。
根据定义,一个项在集合中只能出现一次,不管将它添加了多少次。同样,集合有着广泛的应用,尤其是在涉及数字和数据库的工作中。

我们可以看到,一个集合的行为很像一个无值的字典的键,但是,它还支持额外的操作。

然而,由于集合是无序的,并且不会把键匹配到值,它们既不是序列也不是映射类型,它们是自成一体的类型。

========================================================================================

要创建一个集合对象,向内置的set函数传递一个序列或其他可迭代的对象:

>>> x = set('abcde')>>> y = set('bdxyz')
得到了一个集合对象,其中包含传递的对象的所有元素(注意,集合并不包含位置顺序,序列却包含):

>>> x{'b', 'c', 'd', 'a', 'e'}>>> y{'b', 'd', 'x', 'y', 'z'}
集合通过表达式操作符支持一般的数学几何运算。注意,不能再一般序列上应用这些表达式,必须通过序列创建集合后才能使用这些工具。

>>> 'e' in xTrue>>> 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 == yFalse
除了表达式,集合对象还提供了对应这些操作的方法: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)bbbcccaaa
尽管前面介绍的集合表达式通常需要两个集合,它们基于方法的对应形式往往对任何可迭代类型也有效:

>>> 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]
 当你遍历图形或其他回环结构的时候,集合可以用来记录已经访问过的位置,必须确保访问过的项不再循环。尽管把访问状态作为键记录到字典中很高效,但集合提供了几乎等同的一种替代方式。

其次,在处理较大的数据集合的时候(例如:数据库查询结果),两个集合的交集包含了两个领域中的共有的对象,并集包含了两个集合的所有项目。

0 0
原创粉丝点击