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