一、Python集合類型
Python集合類型包括 set 和 frozenset 兩種,set 對(duì)象是由具有唯一性的可 hashable對(duì)象組成的無(wú)序多項(xiàng)集。常見用途是成員檢測(cè)、去重和數(shù)學(xué)中的集合類計(jì)算,如交集、并集、差集和對(duì)稱差集等操作。與其他多項(xiàng)集一樣,集合也支持 x in set, len(set) 和 for x in set 操作,但不支持索引、切片或其他序列類的操作。
set 類型是可變的,它的內(nèi)容可以使用 add() 和 remove() 等方法來(lái)改變。由于是可變類型,它沒有哈希值,不能被用作字典的鍵或其他集合的元素。frozenset 類型是不可變的,其內(nèi)容在創(chuàng)建后不能改變,因此可以被用作字典的鍵或其他集合的元素
除了可以使用 set 構(gòu)造器,非空的 set 還可以通過(guò)將以逗號(hào)分隔的元素列表包含于花括號(hào)之內(nèi)來(lái)創(chuàng)建,例如: {‘jack’, ‘sjoerd’}。兩個(gè)構(gòu)造器的作用相同,都可以從可迭代對(duì)象中創(chuàng)建集合。
兩個(gè)類的構(gòu)造器具有相同的作用方式:
返回一個(gè)新的 set 或 frozenset 對(duì)象,其元素來(lái)自于 iterable。 集合的元素必須為 hashable。 要表示由集合對(duì)象構(gòu)成的集合,所有的內(nèi)層集合必須為 frozenset 對(duì)象。 如果未指定 iterable,則將返回一個(gè)新的空集合。
二、Python集合創(chuàng)建
集合可用多種方式來(lái)創(chuàng)建:
- 使用花括號(hào)內(nèi)以逗號(hào)分隔元素的方式: {‘jack’, ‘sjoerd’}
- 使用集合推導(dǎo)式: {c for c in ‘abracadabra’ if c not in ‘abc’}
- 使用類型構(gòu)造器: set(), set(‘foobar’), set([‘a’, ‘b’, ‘foo’])
三、Python集合操作
set 和 frozenset 的實(shí)例提供以下操作:
- len(s):返回集合 s 中的元素?cái)?shù)量(即 s 的基數(shù))。
- x in s:檢測(cè) x 是否為 s 中的成員。
- x not in s:檢測(cè) x 是否非 s 中的成員。
- isdisjoint(other):如果集合中沒有與 other 共有的元素則返回 True。 當(dāng)且僅當(dāng)兩個(gè)集合的交集為空集合時(shí),兩者為不相交集合。
- issubset(other) set <= other:檢測(cè)是否集合中的每個(gè)元素都在 other 之中。
- set < other:檢測(cè)集合是否為 other 的真子集,即 set <= other and set != other。
- issuperset(other) set >= other:檢測(cè)是否 other 中的每個(gè)元素都在集合之中。
- set > other:檢測(cè)集合是否為 other 的真超集,即 set >= other and set != other。
- union(*others) set | other | …:返回一個(gè)新集合,其中包含來(lái)自原集合以及 others 指定的所有集合中的元素。
- intersection(*others) set & other & …:返回一個(gè)新集合,其中包含原集合以及 others 指定的所有集合中共有的元素。
- difference(*others) set – other – …:返回一個(gè)新集合,其中包含原集合中在 others 指定的其他集合中不存在的元素。
- symmetric_difference(other) set ^ other:返回一個(gè)新集合,其中的元素或?qū)儆谠匣驅(qū)儆?other 指定的其他集合,但不能同時(shí)屬于兩者。
- copy():返回原集合的淺拷貝。
注意: union() 、 intersection() 、 difference() 、 symmetric_difference() 、 issubset() 和 issuperset() 方法的非運(yùn)算符版本可以接受任何可迭代對(duì)象作為一個(gè)參數(shù)。相比之下,基于運(yùn)算符的對(duì)應(yīng)方法則要求參數(shù)為集合對(duì)象。這就避開了像 set(‘abc’) & ‘cbs’ 這樣容易出錯(cuò)的結(jié)構(gòu),而換成了可讀性更好的 set(‘abc’).intersection(‘cbs’)。
set 和 frozenset 均支持集合與集合的比較。 兩個(gè)集合當(dāng)且僅當(dāng)每個(gè)集合中的每個(gè)元素均包含于另一個(gè)集合之內(nèi)(即各為對(duì)方的子集)時(shí)則相等。 一個(gè)集合當(dāng)且僅當(dāng)其為另一個(gè)集合的真子集(即為后者的子集但兩者不相等)時(shí)則小于另一個(gè)集合。 一個(gè)集合當(dāng)且僅當(dāng)其為另一個(gè)集合的真超集(即為后者的超集但兩者不相等)時(shí)則大于另一個(gè)集合。
set 的實(shí)例與 frozenset 的實(shí)例之間基于它們的成員進(jìn)行比較。 例如 set(‘abc’) == frozenset(‘abc’) 返回 True,set(‘abc’) in set([frozenset(‘abc’)]) 也一樣。子集與相等比較并不能推廣為完全排序函數(shù)。 例如,任意兩個(gè)非空且不相交的集合不相等且互不為對(duì)方的子集,因此以下 所有 比較均返回 False: a<b, a==b, or a>b。
由于集合僅定義了部分排序(子集關(guān)系),因此由集合構(gòu)成的列表 list.sort() 方法的輸出并無(wú)定義。集合的元素,與字典的鍵類似,必須為 hashable?;旌狭?set 實(shí)例與 frozenset 的二進(jìn)制位運(yùn)算將返回與第一個(gè)操作數(shù)相同的類型。例如: frozenset(‘ab’) | set(‘bc’) 將返回 frozenset 的實(shí)例。
下表列出了可用于 set 而不能用于不可變的 frozenset 實(shí)例的操作:
- update(*others) set |= other | …:更新集合,添加來(lái)自 others 中的所有元素。
- intersection_update(*others) set &= other & …:更新集合,只保留其中在所有 others 中也存在的元素。
- difference_update(*others) set -= other | …:更新集合,移除其中也存在于 others 中的元素。
- symmetric_difference_update(other) set ^= other:更新集合,只保留存在于集合的一方而非共同存在的元素。
- add(elem):將元素 elem 添加到集合中。
- remove(elem):從集合中移除元素 elem。 如果 elem 不存在于集合中則會(huì)引發(fā) KeyError。
- discard(elem):如果元素 elem 存在于集合中則將其移除。
- pop():從集合中移除并返回任意一個(gè)元素。 如果集合為空則會(huì)引發(fā) KeyError。
- clear():從集合中移除所有元素。
注意:
- 非運(yùn)算符版本的 update(), intersection_update(), difference_update() 和 symmetric_difference_update() 方法將接受任意可迭代對(duì)象作為參數(shù)。
- __contains__(), remove() 和 discard() 方法的 elem 參數(shù)可能是一個(gè) set。 為支持對(duì)一個(gè)等價(jià)的 frozenset 進(jìn)行搜索,會(huì)根據(jù) elem 臨時(shí)創(chuàng)建一個(gè)該類型對(duì)象。