Types: 7. Set Types — set, frozenset
7. Set Types — set, frozenset
一个set对象是不同的无序集合可哈希对象。常见用途包括成员资格测试,删除序列中的重复项,以及计算数学运算,如交集,联合,差异和对称差异。(对于其它容器看到内置在dict()
,list()
和tuple()函数
和collections
模块)。
2.4版本中的新功能。
像其他收藏品,集支持x in set
,len(set)
和for x in set
。作为无序集合,集合不会记录元素位置或插入顺序。因此,集合不支持索引,切片或其他类序列行为。
目前有两个内置集类型,set
和frozenset
。该set
类型是可变的 - 可以使用类似add()
和的方法更改内容remove()
。由于它是可变的,因此它没有散列值,不能用作字典键或另一个集的元素。该frozenset
类型是不可变的且可拆分的 - 其内容在创建后不能更改; 因此它可以用作字典键或另一组元素。
从Python 2.7开始,可以通过在花括号中放置以逗号分隔的元素列表来创建非空集(非frozenset
s),例如:{'jack', 'sjoerd'}
除set
构造函数之外。
这两个类的构造函数都是一样的:
class set([iterable])class frozenset([iterable])
返回其元素从迭代
中获取的新集或冻结集对象。一组元素必须是可散列的。为了表示集合集合,内部集合必须是frozenset
对象。如果未指定iterable
,则返回一个新的空集。
实例set
并frozenset
提供以下操作:
len(s)
返回集合的元素数小号
(基数小号
)。
x in s
测试x
在s中的
成员身份。
x not in s
Tes
t x
for non-members
hip 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')
。
双方set
并frozenset
支持设置来设置比较。当且仅当每个集合中的每个元素都包含在另一个中(每个元素是另一个的子集)时,两个集合是相等的。当且仅当第一组是第二组的合适子集(是子集,但不相等)时,集合小于另一集合。当且仅当第一个集合是第二个集合的适当超集(是超集,但不相等)时,集合比另一集合大。
的实例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)
从集合中删除元素
elem
。KeyError
如果元素
不包含在集合中则引发。
discard(elem)
如果它存在,则从集合中移除元素elem
。
pop()
删除并返回该集合中的任意元素。KeyError
如果该集合为空,则引发。
clear()
删除集合中的所有元素。
需要注意的的非运营商的版本update()
,intersection_update()
,difference_update()
,和symmetric_difference_update()
方法会接受任何迭代器作为参数。
请注意,该ELEM
参数的__contains__()
,remove()
和discard()
方法可能是一组。为了支持搜索等效的冻结集,elem
集在搜索过程中暂时发生变化,然后进行恢复。在搜索期间,elem
集不应该被读或者变异,因为它没有一个有意义的值。