做自(zì)由與創造的先行者

Types: 7. Set Types — set, frozenset

Python開(kāi)發手冊

7. Set Types — set, frozenset

一個set對(duì)象是不同的無序集合可哈希對(duì)象。常見用(yòng)途包括成員資格測試,删除序列中的重複項,以及計(jì)算(suàn)數學運算(suàn),如交集,聯合,差異和(hé)對(duì)稱差異。(對(duì)于其它容器看(kàn)到(dào)内置在dict(),list()和(hé)tuple()函數和(hé)collections模塊)。

2.4版本中的新功能(néng)。

像其他(tā)收藏品,集支持x in set,len(set)和(hé)for x in set。作(zuò)爲無序集合,集合不會(huì)記錄元素位置或插入順序。因此,集合不支持索引,切片或其他(tā)類序列行爲。

目前有兩個内置集類型,set和(hé)frozenset。該set類型是可變的 - 可以使用(yòng)類似add()和(hé)的方法更改内容remove()。由于它是可變的,因此它沒有散列值,不能(néng)用(yòng)作(zuò)字典鍵或另一個集的元素。該frozenset類型是不可變的且可拆分的 - 其内容在創建後不能(néng)更改; 因此它可以用(yòng)作(zuò)字典鍵或另一組元素。

從(cóng)Python 2.7開(kāi)始,可以通過在花(huā)括号中放(fàng)置以逗号分隔的元素列表來(lái)創建非空(kōng)集(非frozensets),例如:{'jack', 'sjoerd'}除set構造函數之外(wài)。

這(zhè)兩個類的構造函數都是一樣的:

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

返回其元素從(cóng)叠代中獲取的新集或凍結集對(duì)象。一組元素必須是可散列的。爲了(le)表示集合集合,内部集合必須是frozenset對(duì)象。如果未指定iterable,則返回一個新的空(kōng)集。

實例set并frozenset提供以下(xià)操作(zuò):

len(s)

返回集合的元素數小(xiǎo)号(基數小(xiǎo)号)。

x in s

測試x在s中的成員身份。

x not in s

Test x for non-membership in s.

isdisjoint(other)

True如果集合沒有與其他(tā)元素相同的元素,則返回。當且僅當它們的交集是空(kōng)集時(shí),集合才是不相交的。

2.6版本中的新功能(néng)。

issubset(other)set <= other

測試集合中的每個元素是否在其他(tā)元素中。

set < other

測試該集合是否是其他(tā)集合的正确子集,也(yě)就是說set <= other and set != other。

issuperset(other)set >= other

測試其他(tā)元素中的每個元素是否在集合中。

set > other

測試集合是否是其他(tā)集合的正确集合,也(yě)就是說set >= other and set != other。

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

用(yòng)集合中的元素和(hé)所有其他(tā)元素返回一個新集合。

在版本2.6中更改:接受多個輸入叠代。

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

返回一個新集合,其中包含該集合和(hé)其他(tā)所有元素共有的元素。

在版本2.6中更改:接受多個輸入叠代。

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

返回集合中不包含其他(tā)元素的新集合。

在版本2.6中更改:接受多個輸入叠代。

symmetric_difference(other)set ^ other

用(yòng)集合中的元素或其他(tā)元素返回一個新集合,但(dàn)不能(néng)同時(shí)返回兩個元素。

copy()

用(yòng)s的淺拷貝返回一個新的集合。

注意,對(duì)非運營商的版本union(),intersection(),difference(),和(hé)symmetric_difference(),issubset()和(hé)issuperset()方法将接受任何可叠代作(zuò)爲參數。相反,他(tā)們的基于操作(zuò)員的對(duì)應方要求他(tā)們的參數是集合。這(zhè)排除了(le)易于出錯的結構,例如set('abc') & 'cbs'有利于更具可讀性的結構set('abc').intersection('cbs')。

雙方set并frozenset支持設置來(lái)設置比較。當且僅當每個集合中的每個元素都包含在另一個中(每個元素是另一個的子集)時(shí),兩個集合是相等的。當且僅當第一組是第二組的合适子集(是子集,但(dàn)不相等)時(shí),集合小(xiǎo)于另一集合。當且僅當第一個集合是第二個集合的适當超集(是超集,但(dàn)不相等)時(shí),集合比另一集合大(dà)。

的實例set進行比較的情況下(xià),frozenset根據自(zì)己的成員。例如,set('abc') == frozenset('abc')返回True等等set('abc') in set([frozenset('abc')])。

子集和(hé)等式比較不推廣到(dào)總排序函數。例如,任何兩個非空(kōng)不相交的集合不相等,并且不彼此的子集,所以所有的以下(xià)返回False:ab。因此,集合不執行該__cmp__()方法。

由于集合隻定義了(le)部分排序(子集關系),所以該list.sort()方法的輸出對(duì)于集合列表是未定義的。

設置元素,如字典鍵,必須是可散列的。

混合set實例的二進制操作(zuò)frozenset返回第一個操作(zuò)數的類型。例如:frozenset('ab') | set('bc')返回一個實例frozenset。

下(xià)表列出了(le)set不适用(yòng)于以下(xià)不可變實例的可用(yòng)操作(zuò)frozenset:

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

更新集合,添加所有其他(tā)元素。

在版本2.6中更改:接受多個輸入叠代。

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

更新集合,隻保留其中的元素和(hé)其他(tā)所有元素。

在版本2.6中更改:接受多個輸入叠代。

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

更新設置,删除其他(tā)設備中的元素。

在版本2.6中更改:接受多個輸入叠代。

symmetric_difference_update(other)set ^= other

更新集合,隻保留任一集合中的元素,但(dàn)不能(néng)同時(shí)存在于兩者中。

add(elem)

将元素elem添加到(dào)集合中。

remove(elem)

從(cóng)集合中删除元素elem。KeyError如果元素不包含在集合中則引發。

discard(elem)

如果它存在,則從(cóng)集合中移除元素elem。

pop()

删除并返回該集合中的任意元素。KeyError如果該集合爲空(kōng),則引發。

clear()

删除集合中的所有元素。

需要注意的的非運營商的版本update(),intersection_update(),difference_update(),和(hé)symmetric_difference_update()方法會(huì)接受任何叠代器作(zuò)爲參數。

請(qǐng)注意,該ELEM參數的__contains__(),remove()和(hé)discard()方法可能(néng)是一組。爲了(le)支持搜索等效的凍結集,elem集在搜索過程中暫時(shí)發生變化,然後進行恢複。在搜索期間,elem集不應該被讀或者變異,因爲它沒有一個有意義的值。

網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發
下(xià)一篇:Types: 8. Mapping Types — dict
上(shàng)一篇:Types: 6. Sequence Types — str, unicode, list, tuple, bytear