Python 集合型別 set,frozenset 使用說明
Python 集合型別
Python 的集合型別set
(集合)和frozenset
(凍結集合),與 Python 序列型別有眾多相似之處,但集合型別可有效的用於數學集合運算,比如,計算兩個集合的並集。
Python 集合中的元素是不可重複的
集合中的元素需要確保自己在集合中的唯一性,通過物件的__eq__
方法,以及__hash__
方法傳回的雜湊值,可以判斷一個元素是否與另一個元素重複,重複的多余元素將從集合中移除。
Python 集合中的元素是未排序的
在某些情況下,Python 集合會進行自動排序,比如,書寫{100,102,101}
建立一個集合,該集合可能變為{100,101,102}
。這種自動排序擁有很大的“隨機性”,因此 Python 集合是未排序的,比如,書寫{100,102,101,1,96,95,94}
建立集合,結果可能變為{96,1,100,101,102,94,95}
。
Python 物件的 __hash__ 和 __eq__ 方法
物件的__hash__
方法傳回物件對應的雜湊值,在 Python 中,該值應該是一個整數。物件的__eq__
方法用於判斷物件之間是否為相等的關系。
Python set,frozenset 型別
同樣作為 Python 的集合型別,frozenset
是不可變的,set
是可變的,其支援的功能和操作也更多。無論是set
還是frozenset
,都可以使用建構子來建立執行個體。
set([iterable], /)
frozenset([iterable], /)
- iterable 參數
iterable
參數是一個疊代器物件,疊代器中的元素將包含在集合中。如果未指定,則會得到一個空集合。
對於set
型別,除了建構子,還可以使用{}
來建立執行個體,{}
中為集合中包含的元素,元素之間使用,
進行分隔。
另外,在{}
中使用綜合運算可以進行更為複雜的操作,綜合運算的格式為y for x in iterable
,其中,iterable
為疊代器物件,x
為疊代器中的元素,y
為一個運算式,通常會通過x
產生新的值。
不能使用 {} 來建立空的 Python 集合
需要指出,你不能使用{}
來建立空集合,因為{}
會傳回一個空的字典(dict
)物件。要建立空集合,可以書寫set()
。
set()
set()
{1, 2, 3}
{1, 2, 3}
frozenset([1, 2, 3])
frozenset({1, 2, 3})
取得 Python 集合,凍結集合中元素的個數
使用len
函式,可以取得 Python 集合,凍結集合的元素個數,比如,len({3,2,2,1,1})
的運算結果為3
。
判斷 Python 集合,凍結集合是否存在某個元素
使用x in s
或x not in s
,可以判斷 Python 集合,凍結集合中是否存在或不存在某個元素,x
為需要判斷的元素,s
為集合物件。
100 in {100, 101, 102}
True
判斷 Python 集合,凍結集合之間的關系
Python 提供了如下方法,用於判斷集合或凍結集合之間的關系。
isdisjoint
方法用於判斷集合與指定目標的交集是否空,即集合中的元素是否均未在目標中出現,如果是則傳回True
,否則傳回False
,這裏的目標是一個疊代器物件。
issubset
方法用於判斷集合是否為指定目標的子集,即集合中的元素是否均在目標中出現,如果是則傳回True
,否則傳回False
,這裏的目標是一個疊代器物件。此外,使用運算子<=
可以實作相同的效果,他會判斷左邊集合是否為右邊集合的子集。
運算子<
用於判斷左邊集合是否為右邊集合的真子集,即左邊集合的元素均在右邊集合中出現,且右邊集合擁有左邊集合不存在的元素。
issuperset
方法用於判斷集合是否為指定目標的超集,即目標包含的元素均在集合中出現,如果是則傳回True
,否則傳回False
,這裏的目標是一個疊代器物件。此外,使用運算子>=
可以實作相同的效果,他會判斷左邊集合是否為右邊集合的超集。
運算子>
用於判斷左邊集合是否為右邊集合的真超集,即右邊集合的元素均在左邊集合中出現,且左邊集合擁有右邊集合不存在的元素。
運算子==
用於判斷左邊集合是否與右邊集合相等,即右邊集合的元素均在左邊集合中出現,左邊集合的元素也均在右邊集合中出現。
isdisjoint(other, /)
issubset(other, /)
issuperset(other, /)
- other 參數
other
參數為參與關系判斷的疊代器物件。
{3,2,1}.isdisjoint((4,))
True
{3,2,1}<={1,2,3}
True
{3,2,1}.issuperset((1,2,3))
True
{3,2,1}>{1,2,3}
False
set() == set()
True
計算 Python 集合,凍結集合
Python 提供了如下方法,用於集合或凍結集合的計算。
union
方法將計算並傳回一個並集集合,其型別與目標集合的型別相同,包含了目標集合與疊代器中的所有元素。此外,使用運算子|
聯結多個集合,可以產生相同的效果,你會得到一個新集合,其型別與運算子|
左邊的集合的型別相同。
intersection
方法將計算並傳回一個交集集合,其型別與目標集合的型別相同,包含了即存在於目標集合,又存在於疊代器的元素。此外,使用運算子&
聯結多個集合,可以產生相同的效果,你會得到一個新集合,其型別與運算子&
左邊的集合的型別相同,集合中的元素即存在於運算子&
左邊的集合,又存在於運算子&
右邊的集合。
difference
方法將計算並傳回一個差集集合,其型別與目標集合的型別相同,包含了存在於目標集合,但不存在於疊代器的元素。此外,使用運算子-
聯結多個集合,可以產生相同的效果,你會得到一個新集合,其型別與運算子-
左邊的集合的型別相同,集合中的元素存在於運算子-
左邊的集合,但不存在於運算子-
右邊的集合。
symmetric_difference
方法將計算並傳回一個對稱差集集合,其型別與目標集合的型別相同,包含了僅存在於目標集合,或僅存在於疊代器的元素。此外,使用運算子^
聯結多個集合,可以產生相同的效果,你會得到一個新集合,其型別與運算子^
左邊的集合的型別相同,集合中的元素或僅存在於運算子^
左邊的集合,或僅存在於運算子^
右邊的集合。
union(*other)
intersection(*other)
difference(*other)
symmetric_difference(other, /)
- other 參數
other
參數為參與計算的疊代器物件。
{1}.union((3,4,1))
{1, 3, 4}
{1} | {2,1} | {2, 3}
{1, 2, 3}
frozenset({1, 2, 3}).intersection({1})
frozenset({1})
{1, 2, 3} & set()
set()
{1, 2, 3}.difference([1], [3])
{2}
frozenset({1, 2, 3}) ^ {2, 3, 4}
frozenset({1, 4})
複製 Python 集合,凍結集合
使用 Python 集合,凍結集合的copy
方法,你可以對集合進行陰影複製,複製的集合與被複製的集合互不影響,但兩個集合中的元素可能會保持對同一物件的參考。
a = {1, 2, 3}
b = a.copy()
b.add(4)
a
{1, 2, 3}
b
{1, 2, 3, 4}
更新 Python 集合
Python 提供了以下方法,用於集合(set
)的更新,這表示集合本身會被修改。
update
方法會嘗試把疊代器中的所有元素新增至集合,重複的元素將被忽略。此外,使用運算子|=
可以產生相同的效果,他會把右邊集合中的元素新增至左邊集合。
intersection_update
方法會更新集合,所有未在疊代器中出現的元素將被移除。此外,使用運算子&=
可以產生相同的效果,他會把所有未出現在右邊集合的元素,從左邊集合中移除。
difference_update
方法會更新集合,所有在疊代器中出現的元素將被移除。此外,使用運算子-=
可以產生相同的效果,他會把所有出現在右邊集合的元素,從左邊集合中移除。
symmetric_difference
方法計算所有未同時出現在集合和疊代器中的元素,這些元素最終成為集合的所有元素。此外,使用運算子^=
可以產生相同的效果,他會計算所有未同時出現在左邊集合和右邊集合的元素,並確保他們成為左邊集合的所有元素。
update(*other)
intersection_update(*other)
difference_update(*other)
symmetric_difference_update(other, /)
- other 參數
other
參數為參與更新的疊代器物件。
s = {1, 2, 3, 4}
s.update((1, 2), (5, 6))
s
{1, 2, 3, 4, 5, 6}
s &= {1, 6} | {5, 2, 4}
s
{1, 2, 4, 5, 6}
s.difference_update({4} | {5})
s
{1, 2, 6}
s ^= {2, 6, 7}
s
{1, 7}
為 Python 集合新增元素
使用set
型別的add
方法,你可以為集合新增一個元素。
add(elem, /)
- elem 參數
elem
參數表示需要新增的元素。
s = set()
s.add(1)
s
{1}
刪除 Python 集合中的元素
對於刪除元素,Python 的set
型別提供了如下方法。
remove
方法用於將指定元素從集合中刪除,如果元素不存在,則會引發例外狀況KeyError
。
discard
方法用於將指定元素從集合中刪除,但他不會像remove
方法一樣引發例外狀況。
pop
方法用於刪除並傳回集合中的任意一個元素,如果是空集合,則將引發例外狀況KeyError
。
clear
方用於刪除集合中的所有元素。
Python 集合的 pop 方法是否隨機傳回元素?
雖然,在一些情況下pop
方法會固定傳回集合的第一個元素,但你依然可以認為pop
方法隨機傳回元素,因為元素的位置具有“隨機性”。
remove(elem, /)
discard(elem, /)
- elem 參數
elem
參數為需要刪除的元素。
s = {1, 2, 3, 4, 5, 6}
s.remove(3)
s
{1, 2, 4, 5, 6}
s.discard(3)
s
{1, 2, 4, 5, 6}
s.pop()
1
s.clear()
s
set()