Python 集合型別 set,frozenset 使用說明

閱讀 10:44·字數 3221·發佈 
Youtube 頻道
訂閱 133

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 sx 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()