在线文档教程

Types: 7. Set Types — set, frozenset

7. Set Types — set, frozenset

一个set对象是不同的无序集合可哈希对象。常见用途包括成员资格测试,删除序列中的重复项,以及计算数学运算,如交集,联合,差异和对称差异。(对于其它容器看到内置在dict()list()tuple()函数collections模块)。

2.4版本中的新功能。

像其他收藏品,集支持x in setlen(set)for x in set。作为无序集合,集合不会记录元素位置或插入顺序。因此,集合不支持索引,切片或其他类序列行为。

目前有两个内置集类型,setfrozenset。该set类型是可变的 - 可以使用类似add()和的方法更改内容remove()。由于它是可变的,因此它没有散列值,不能用作字典键或另一个集的元素。该frozenset类型是不可变的且可拆分的 - 其内容在创建后不能更改; 因此它可以用作字典键或另一组元素。

从Python 2.7开始,可以通过在花括号中放置以逗号分隔的元素列表来创建非空集(非frozensets),例如:{'jack', 'sjoerd'}set构造函数之外。

这两个类的构造函数都是一样的:

class set([iterable])class frozenset([iterable])

返回其元素从迭代中获取的新集或冻结集对象。一组元素必须是可散列的。为了表示集合集合,内部集合必须是frozenset对象。如果未指定iterable,则返回一个新的空集。

实例setfrozenset提供以下操作:

len(s)

返回集合的元素数小号(基数小号)。

x in s

测试xs中的成员身份。

x not in s

Test x for non-membership in s.

isdisjoint(other)

True如果集合没有与其他元素相同的元素,则返回。当且仅当它们的交集是空集时,集合才是不相交的。

2.6版本中的新功能。

issubset(other)set <= other

测试集合中的每个元素是否在其他元素中。

set < other

测试该集合是否是其他集合的正确子集,也就是说set <= other and set != other。

issuperset(other)set >= other

测试其他元素中的每个元素是否在集合中。

set > other

测试集合是否是其他集合的正确集合,也就是说set >= other and set != other。

union(*others)set | other | ...

用集合中的元素和所有其他元素返回一个新集合。

在版本2.6中更改:接受多个输入迭代。

intersection(*others)set & other & ...

返回一个新集合,其中包含该集合和其他所有元素共有的元素。

在版本2.6中更改:接受多个输入迭代。

difference(*others)set - other - ...

返回集合中不包含其他元素的新集合。

在版本2.6中更改:接受多个输入迭代。

symmetric_difference(other)set ^ other

用集合中的元素或其他元素返回一个新集合,但不能同时返回两个元素。

copy()

s的浅拷贝返回一个新的集合。

注意,对非运营商的版本union()intersection()difference(),和symmetric_difference()issubset()issuperset()方法将接受任何可迭代作为参数。相反,他们的基于操作员的对应方要求他们的参数是集合。这排除了易于出错的结构,例如set('abc') & 'cbs'有利于更具可读性的结构set('abc').intersection('cbs')

双方setfrozenset支持设置来设置比较。当且仅当每个集合中的每个元素都包含在另一个中(每个元素是另一个的子集)时,两个集合是相等的。当且仅当第一组是第二组的合适子集(是子集,但不相等)时,集合小于另一集合。当且仅当第一个集合是第二个集合的适当超集(是超集,但不相等)时,集合比另一集合大。

的实例set进行比较的情况下,frozenset根据自己的成员。例如,set('abc') == frozenset('abc')返回True等等set('abc') in set([frozenset('abc')])

子集和等式比较不推广到总排序函数。例如,任何两个非空不相交的集合不相等,并且不彼此的子集,所以所有的以下返回False:a<b,a==b,或a>b。因此,集合不执行该__cmp__()方法。

由于集合只定义了部分排序(子集关系),所以该list.sort()方法的输出对于集合列表是未定义的。

设置元素,如字典键,必须是可散列的

混合set实例的二进制操作frozenset返回第一个操作数的类型。例如:frozenset('ab') | set('bc')返回一个实例frozenset

下表列出了set不适用于以下不可变实例的可用操作frozenset

update(*others)set |= other | ...

更新集合,添加所有其他元素。

在版本2.6中更改:接受多个输入迭代。

intersection_update(*others)set &= other & ...

更新集合,只保留其中的元素和其他所有元素。

在版本2.6中更改:接受多个输入迭代。

difference_update(*others)set -= other | ...

更新设置,删除其他设备中的元素。

在版本2.6中更改:接受多个输入迭代。

symmetric_difference_update(other)set ^= other

更新集合,只保留任一集合中的元素,但不能同时存在于两者中。

add(elem)

将元素elem添加到集合中。

remove(elem)

从集合中删除元素elemKeyError如果元素不包含在集合中则引发。

discard(elem)

如果它存在,则从集合中移除元素elem

pop()

删除并返回该集合中的任意元素。KeyError如果该集合为空,则引发。

clear()

删除集合中的所有元素。

需要注意的的非运营商的版本update()intersection_update()difference_update(),和symmetric_difference_update()方法会接受任何迭代器作为参数。

请注意,该ELEM参数的__contains__()remove()discard()方法可能是一组。为了支持搜索等效的冻结集,elem集在搜索过程中暂时发生变化,然后进行恢复。在搜索期间,elem集不应该被读或者变异,因为它没有一个有意义的值。