HOWTO · Python

在 Python 中從集合中刪除元素

在 Python 中從集合中刪除元素有多種方法。remove() 和 discard() 函數刪除單個元素,pop() 刪除任意一個元素,而 - 運算子、difference() 和 difference_update() 則一次刪除多個元素。

本頁內容

本教學將討論在 Python 中從集合中刪除元素的不同方法。刪除單個元素可以使用 remove()、discard() 或 pop();一次刪除多個元素可以使用 - 運算子、difference() 或 difference_update()。

使用 remove() 函數刪除單個元素

set.remove() 函數從集合中刪除指定的元素。它以要刪除的元素作為參數。如果元素存在,就會被刪除;如果元素不存在,remove() 會引發 KeyError。請看下面的程式碼範例。

set1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
set1.remove(5)
print(set1)

輸出:

{0, 1, 2, 3, 4, 6, 7, 8, 9}

在上面的程式碼中,我們用 remove(5) 從 set1 中刪除了元素 5。下面這個範例展示了指定值不在集合中的情形。

set1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
set1.remove(51)
print(set1)

輸出:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyError: 51

我們嘗試從 set1 中刪除值 51。由於 set1 中不存在值 51,remove() 函數會引發 KeyError。

使用 discard() 函數刪除單個元素

discard() 函數與 remove() 非常相似:如果值存在,它就從集合中刪除指定的元素。唯一的區別是,如果值不在集合中,discard() 不會引發 KeyError——它只是讓集合保持不變。下面的程式碼片段展示了如何用 discard() 從集合中刪除單個元素。

set1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
set1.discard(5)
print(set1)

輸出:

{0, 1, 2, 3, 4, 6, 7, 8, 9}

我們用 discard() 函數從 set1 中刪除了值 5。如上所述,如果傳入的值不在 set1 中,程式碼仍會成功執行且不會引發任何異常,如下面的範例所示。

set1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
set1.discard(51)
print(set1)

輸出:

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

我們嘗試用 discard() 函數從 set1 中刪除 51。由於指定值在 set1 中不存在,沒有元素被刪除,也沒有錯誤發生;set1 原樣輸出。

使用 pop() 函數刪除任意元素

pop() 函數從集合中刪除並返回一個任意元素。當你不關心刪除哪個元素時使用它,例如逐個處理元素直到集合為空時。

set1 = {1, 2, 3, 4, 5}
removed = set1.pop()
print(removed)
print(set1)

輸出:

1
{2, 3, 4, 5}

pop() 返回了 1 並將其從 set1 中刪除。返回哪個元素是任意的——語言並不保證是特定的某一個——因此絕不能依賴 pop() 刪除某個特定的值。與 remove() 一樣,如果集合為空,pop() 也會引發 KeyError。

使用 - 運算子刪除多個元素

- 運算子在 Python 中執行集合差集運算。它從左側集合中刪除右側集合的所有元素,並以新集合的形式返回結果。右側集合中不在左側集合裡的元素會被直接忽略,這種方法不會引發任何異常。下面的程式碼片段展示了如何用 - 運算子刪除多個元素。

set1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
set2 = {2, 4, 6, 8, 0}
set1 = set1 - set2
print(set1)

輸出:

{1, 3, 5, 7, 9}

我們用 - 運算子從 set1 中刪除了 set2 的所有元素,並把結果集合賦回給 set1。下面的程式碼範例展示了兩個集合沒有共同元素的情形。

set1 = {1, 3, 5, 7, 9}
set2 = {2, 4, 6, 8, 0}
set1 = set1 - set2
print(set1)

輸出:

{1, 3, 5, 7, 9}

由於右側集合的元素沒有一個在左側集合中,程式碼成功執行,- 運算子原樣返回左側集合。

使用 difference() 函數刪除多個元素

set.difference() 函數以方法的形式執行與 - 運算子相同的集合差集運算。它以需要刪除其元素的集合作為輸入參數,從呼叫集合中刪除其所有元素,並以新集合的形式返回結果。請看下面的程式碼片段。

set1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
set2 = {2, 4, 6, 8, 0}
set1 = set1.difference(set2)
print(set1)

輸出:

{1, 3, 5, 7, 9}

我們用 difference() 函數從 set1 中刪除了 set2 的所有元素,並把結果存入 set1。當輸入集合的值不在呼叫集合中時,difference() 的情形與 - 運算子相同:什麼都不刪除,也不引發錯誤。

使用 difference_update() 函數原地刪除多個元素

前兩種方法都會返回一個新集合,因此結果必須存放在某處。difference_update() 函數則不同:它原地更新呼叫集合,直接從中刪除參數集合的所有元素。

set1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
set2 = {2, 4, 6, 8, 0}
set1.difference_update(set2)
print(set1)

輸出:

{1, 3, 5, 7, 9}

我們用 difference_update() 函數從 set1 中刪除了 set2 的所有元素,set1 本身現在就保存著結果集合——與前兩種方法不同,不需要為了存放結果而再建立一個新集合。difference_update() 函數等價於 Python 中的 -= 運算子。

結論

刪除單個元素時,元素必須存在就用 remove()——缺失的元素會引發 KeyError,能讓錯誤儘早暴露;元素可能不存在就用 discard()。任意元素都可以時用 pop()。一次刪除多個元素時,用 - 運算子或 difference() 得到新集合,或用 difference_update()(等價於 -=)原地更新集合。