URLhttps://learnscript.net/zh-hant/python/data-types/set-types/
    複製連結移至說明  範例

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

    閱讀 10:38·字數 3194·發佈 
    Youtube 頻道
    訂閱 375

    Python 集合型別

    Python 的集合型別set(集合)和frozenset(凍結集合),與序列型別有眾多相似之處,但集合型別可有效的用於數學集合運算,比如,計算兩個集合的並集。

    集合中的元素是不可重複的

    集合中的元素需要確保自己在集合中的唯一性,通過物件的__eq__方法,以及__hash__方法傳回的雜湊值,可以判斷一個元素是否與另一個元素重複,重複的多余元素將從集合中移除。

    集合中的元素是未排序的

    在某些情況下,集合會進行自動排序,比如,書寫{100,102,101}建立一個集合,該集合可能變為{100,101,102}。這種自動排序擁有很大的「隨機性」,因此集合是未排序的,比如,書寫{100,102,101,1,96,95,94}建立集合,結果可能變為{96,1,100,101,102,94,95}

    Python 物件的 __hash__ 和 __eq__ 方法

    物件的__hash__方法傳回物件對應的雜湊值,在 Python 中,該值應該是一個整數。物件的__eq__方法用於判斷物件之間是否為相等的關系。

    set,frozenset 型別

    同樣作為集合型別,frozenset是不可變的,set是可變的,其支援的功能和操作也更多。無論是set還是frozenset,都可以使用建構子來建立執行個體。

    set([iterable], /)
    frozenset([iterable], /)

    iterable 參數

    iterable參數是一個疊代器物件,疊代器中的元素將包含在集合中。如果未指定,則會得到一個空集合。

    對於set型別,除了建構子,還可以使用{}來建立執行個體,{}中為集合中包含的元素,元素之間使用,進行分隔。

    另外,在{}中使用生成式可以進行更為複雜的操作,生成式的格式為y for x in iterable,其中,iterable為疊代器物件,x為疊代器中的元素,y為一個運算式,通常會通過x產生新的值。

    不能使用 {} 來建立空的集合

    需要指出,你不能使用{}來建立空集合,因為{}會傳回一個空的字典(dict)物件。要建立空集合,可以書寫set()

    set()
    set()
    {1, 2, 3}
    {1, 2, 3}
    frozenset([1, 2, 3])
    frozenset({1, 2, 3})

    取得 Python 集合,凍結集合中元素的個數

    使用len函式,可以取得集合,凍結集合的元素個數,比如,len({3,2,2,1,1})的運算結果為3

    判斷 Python 集合,凍結集合是否存在某個元素

    使用x in sx not in s,可以判斷集合,凍結集合中是否存在或不存在某個元素,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 集合,凍結集合

    使用集合,凍結集合的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 集合中的元素

    對於刪除元素,set型別提供了如下方法。

    remove方法用於將指定元素從集合中刪除,如果元素不存在,則會引發例外狀況KeyError

    discard方法用於將指定元素從集合中刪除,但他不會像remove方法一樣引發例外狀況。

    pop方法用於刪除並傳回集合中的任意一個元素,如果是空集合,則將引發例外狀況KeyError

    clear方用於刪除集合中的所有元素。

    集合的 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()