HOWTO · Python

Python でセットから要素を削除する

Python のセットから要素を削除する方法はいくつかあります。remove() と discard() 関数は 1 つの要素を削除し、pop() は任意の要素を削除し、- 演算子、difference()、difference_update() は複数の要素を一度に削除します。

このページの内容

このチュートリアルでは、Python のセットから要素を削除するさまざまな方法について説明します。1 つの要素を削除するには 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) で要素 5 を set1 から削除しました。指定した値がセットに存在しない場合を、以下の例で示します。

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() 関数で値 5 を set1 から削除しました。上記のように、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() 関数で 51 を set1 から削除しようとしました。指定した値は set1 に存在しないため、要素は削除されず、エラーも発生しません。set1 は変更されずに出力されます。

pop() 関数で任意の要素を削除する

pop() 関数は、セットから任意の要素を削除し、それを返します。どの要素が削除されても構わない場合、例えばセットが空になるまで要素を 1 つずつ処理する場合に使います。

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}

- 演算子で set2 の要素をすべて set1 から削除し、結果のセットを set1 に代入し直しました。次のコード例は、2 つのセットに共通する要素がない場合を示しています。

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

出力:

{1, 3, 5, 7, 9}

右側のセットの要素が 1 つも左側のセットに存在しないため、コードは正常に実行され、- 演算子は左側のセットを変更せずに返します。

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() 関数で set2 の要素をすべて set1 から削除し、結果を set1 に格納しました。入力セットの値が呼び出し元のセットに存在しない場合の difference() の動作は - 演算子と同じです:何も削除されず、エラーも発生しません。

difference_update() 関数で複数の要素をその場で削除する

前の 2 つのメソッドは新しいセットを返すため、結果をどこかに格納する必要があります。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() 関数で set2 の要素をすべて set1 から削除し、set1 自体が結果のセットになりました — 前の 2 つのメソッドとは異なり、結果を格納するためだけに新しいセットを作成する必要はありませんでした。difference_update() 関数は Python の -= 演算子と等価です。

結論

単一の要素を削除するには、要素が必ず存在すべき場合は remove() を(欠けている要素は KeyError を発生させ、ミスを早期に表面化させます)、要素が存在しない可能性がある場合は discard() を使います。任意の要素でよい場合は pop() を使います。複数の要素を一度に削除するには、新しいセットを得るために - 演算子か difference() を、セットをその場で更新するために difference_update()(等価な -=)を使います。