Pythonのset(集合型)は、要素の追加だけでなく、不要になった要素の削除も自由に(ミュータブルに)行えます。
要素を削除する方法はいくつかありますが、特に .remove() と .discard() の動作の違いを理解しておくことが重要です。また、すべての要素を一括で削除する .clear() もあります。
この記事では、set から要素を削除する3つの主要なメソッドについて解説します。
1. .remove(element) – 要素を指定して削除(エラー発生の可能性あり)
.remove() メソッドは、引数で指定した値(element)を set から削除します。
重要な注意点:
もし指定した要素が set の中に存在しない場合、KeyError というエラーが発生し、プログラムが停止します。
構文:
set変数.remove(削除したい要素)
使用例:
# 申請中のユーザーセット
pending_users = {"u001", "u002", "u005", "u007"}
print(f"削除前: {pending_users}")
# 1. 存在する要素 "u005" を削除
try:
pending_users.remove("u005")
print(f"「u005」削除後: {pending_users}")
except KeyError:
print("「u005」は見つかりませんでした。")
# 2. 存在しない要素 "u999" を削除しようとするとエラー
try:
pending_users.remove("u999")
except KeyError as e:
print(f"「u999」削除時: {e} が発生しました。")
実行結果:
削除前: {'u001', 'u007', 'u005', 'u002'}
「u005」削除後: {'u001', 'u007', 'u002'}
「u999」削除時: 'u999' が発生しました。
.remove() は、その要素が set 内に必ず存在すると確信している場合に使用します。
2. .discard(element) – 要素を指定して削除(エラーなし)
.discard() メソッドも、引数で指定した値を set から削除します。
.remove() との最大の違いは、指定した要素が set の中に存在しなくても、エラー(KeyError)が発生しない点です。何もせず、そのまま処理が継続されます。
構文:
set変数.discard(削除したい要素)
使用例:
# 処理中のタスクセット
active_tasks = {"task-A", "task-B", "task-C"}
print(f"削除前: {active_tasks}")
# 1. 存在する要素 "task-B" を削除
active_tasks.discard("task-B")
print(f"「task-B」削除後: {active_tasks}")
# 2. 存在しない要素 "task-Z" を削除
# エラーは発生しない
active_tasks.discard("task-Z")
print(f"「task-Z」削除後: {active_tasks}")
実行結果:
削除前: {'task-C', 'task-A', 'task-B'}
「task-B」削除後: {'task-C', 'task-A'}
「task-Z」削除後: {'task-C', 'task-A'}
.discard() は、要素が存在するかどうかわからない場合に、安全に削除処理を行いたい場合に非常に適しています。
3. .clear() – 全ての要素を削除
.clear() メソッドは、set に含まれる全ての要素を一括で削除し、set を空の状態にします。
構文:
set変数.clear()
使用例:
# 一時キャッシュのセット
temp_cache = {"item1", "item2", "item3"}
print(f"クリア前: {temp_cache}")
# キャッシュをすべてクリア
temp_cache.clear()
print(f"クリア後: {temp_cache}")
実行結果:
クリア前: {'item3', 'item1', 'item2'}
クリア後: set()
中身が空になり、set() と表示されます。
まとめ:削除メソッドの使い分け
| メソッド | 指定方法 | 存在しない場合 |
.remove() | 値 | KeyError 発生 |
.discard() | 値 | エラーなし(無視) |
.clear() | (なし) | (該当なし) |
- 要素が存在することを前提に削除するなら
.remove()。 - 存在しなくてもエラーにしたくない、安全に削除したいなら
.discard()。 - 全て削除したいなら
.clear()。
