其他的数字类型——Sets——在Python 2.6和更早版本中的 set基础

未匹配的标注

当前有几个方法来创建 set,这取决于使用什么版本的Python。因为本书包括了所有版本,所以从2.6和更早版本的情况开始,它们在后续版本的Python中也是可用的(有时仍是必须的);稍后将对2.7和3系列的扩展部分将进行改进。要创建一个set对象,传入一个序列或其他可迭代对象到内置的set函数:

>>> x = set('abcde')
>>> y = set('bdxyz')

返回一个set对象,它包含了传入这个对象的所有项(注意set并没有位置排序,因此不是序列——它们的次序是任意的且在不同的版本中可能不同):

>>> x
set(['a', 'c', 'b', 'e', 'd']) # Pythons <= 2.6 显示格式

用这种方式创建的Set 使用表达式操作符支持通常的数学集合操作。注意不能对简单的序列如字符串,列表和元组执行下面的操作——为了应用下面这些工具,必须通过将简单序列传递给set函数来创建set对象:

>>> x − y # 差集
set(['a', 'c', 'e'])
>>> x | y # 并集
set(['a', 'c', 'b', 'e', 'd', 'y', 'x', 'z'])
>>> x & y # 交集
set(['b', 'd'])
>>> x  y # 对称差集
(XOR)
set(['a', 'c', 'e', 'y', 'x', 'z'])
>>> x > y, x < y # 超集, 子集
(False, False)

这个规则的著名例外是in set 成员测试——这个表达式也被定义为适用于所有其他集合类型,在那里它也执行成员测试(或搜索,如果倾向于用面向程序的术语来思考)。因此,不需要将像字符串和列表这些东西转换为set来运行这个测试:

>>> 'e' in x # 成员 (sets)
True
>>> 'e' in 'Camelot', 22 in [11, 22, 33] # 但也适用于其他类型
(True, True)

除了表达式,set对象还提供了对应于上面这些操作和更多操作的方法,和支持set修改的方法——set的add方法插入项,update是一个就地修改的并集,remove通过值来删除项(在任一set实例或set类型名称上调用dir来查看所有可用的方法):

>>> dir(S)
['__and__', '__class__', '__cmp__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']

假设xy仍和前面交互中一样:

>>> z = x.intersection(y) # 等同于 x & y
>>> z
set(['b', 'd'])
>>> z.add('SPAM') # 插入项
>>> z
set(['b', 'd', 'SPAM'])
>>> z.update(set(['X', 'Y'])) # 合并:就地修改的并集
>>> z
set(['Y', 'X', 'b', 'd', 'SPAM'])
>>> z.remove('b') # 删除项
>>> z
set(['Y', 'X', 'd', 'SPAM'])

作为可迭代容器,set还能被用在如lenfor循环和列表 comprehension这些操作中。然而,因为它们是无序的,所以不支持序列操作如索引和切片:

>>> for item in set('abc'): print(item * 3)
aaa
ccc
bbb

最后,虽然先前展示的set表达式通常需要两个set,但它们基于方法的对应操作还可以经常作用于任何可迭代的类型

>>> S = set([1, 2, 3])
>>> S | set([3, 4]) # 表达式需要两边都是set
set([1, 2, 3, 4])
>>> S | [3, 4]
TypeError: unsupported operand type(s) for |: 'set' and 'list'
>>> S.union([3, 4]) # 但它们的方法允许任何可迭代对象
set([1, 2, 3, 4])
>>> S.intersection((1, 3, 5))
set([1, 3])
>>> S.issubset(range(-5, 5))
True

关于set操作的更多细节,请查阅Python的库参考手册或参考书。虽然在Python中集合操作可以用其他类型如列表和字典(且通常是在过去)来手动编码,但Python内置的set使用了高效的算法和实现技术来提供快速和标准的操作。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~