HOWTO · Python

如何在 Python 中合併兩個集合

本文介紹如何在 Python 中合併兩個集合。

本頁內容

Python 集合會儲存不重複的元素,因此合併兩個集合就是計算它們的聯集:一個包含任一集合中所有元素、並將重複值合併為單一值的集合。你可以使用 | 運算子、union() 方法,或就地修改的 update() 與 |= 形式,取決於你想要一個新集合,還是要修改現有的集合。

使用聯集運算子 (|) 合併集合

聯集運算子 | 接受兩個集合,並回傳一個新集合,其中包含出現在任一集合中的所有元素。原本的集合不會被修改。

以下程式碼範例及其輸出保持英文原文不變。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}

result_set = set1 | set2
print(result_set)
print(set1)
print(set2)

輸出:

{1, 2, 3, 4, 5, 6}
{1, 2, 3, 4}
{3, 4, 5, 6}

共享的值 3 和 4 在 result_set 中只出現一次,而 set1 和 set2 保留其原本的元素。| 的兩個運算元都必須是類集合型別(set 或 frozenset);用 | 將集合與串列合併會產生 TypeError,因此請先用 set() 轉換串列。

使用 update() 或 |= 就地新增元素

當你想讓現有集合吸收另一個集合或可迭代物件的元素,而不是建立新集合時,請使用 update() 方法或 |= 擴增指派。兩者都會修改左側的集合,而不是回傳新集合。

兩者接受的內容不同。update() 接受任何可迭代物件——集合、串列、元組或字串——而 |= 要求右側運算元是類集合型別,與 | 的限制相同。

以下程式碼範例及其輸出保持英文原文不變。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

numbers = {1, 2, 3}

numbers.update([3, 4, 5])
print(numbers)

numbers |= {6, 7}
print(numbers)

輸出:

{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5, 6, 7}

update() 呼叫會直接將串列中的新值加入 numbers,接著 |= 將第二個集合合併到同一個物件中。只有在確定要進行修改時才使用這些形式,因為指向該集合的所有其他參照都會看到這個變更。

使用 union() 合併多個集合或可迭代物件

union() 方法是 | 的方法對應版本。它會回傳一個新集合並保持輸入不變,但與運算子不同的是,它接受任意數量的引數,且每個引數可以是任何可迭代物件,而不僅限於集合。

以下程式碼範例及其輸出保持英文原文不變。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}

result_set = set1.union(set2, {7, 8}, [9, 10])
print(result_set)
print(set1)

輸出:

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
{1, 2, 3, 4}

這裡 union() 在單次呼叫中合併了一個集合、一個集合字面量和一個串列,而 set1 本身保留其原本的元素。當每個運算元都已經是集合時,a.union(b) 產生的結果與 a | b 相同。

依據是否需要新集合來選擇運算方式

根據你想要的結果選擇適合的形式:

  • 你需要一個新集合並保留原本的集合:當兩個運算元都是集合時使用 |;當某個運算元是串列或其他可迭代物件,或要合併三個以上的集合或可迭代物件時,使用 union()。
  • 你想要修改現有集合:任何可迭代物件使用 update(),集合運算元使用 |=。
  • 你在閱讀現有程式碼:對集合而言,a.union(b) 與 a | b 意義相同,a.update(b) 與 a |= b 則是它們對應的就地修改版本。

在大多數程式碼中,result = set1 | set2 是合併兩個集合的直接答案;當運算元可能不是集合時使用 union(),只有在需要就地修改時才使用 update() 或 |=。