用語比較
set.remove()と discard() の違い|要素が無いときの KeyError(Python3基礎)
集合(set)から要素を取り除く方法には remove() と discard() があり、要素が集合にあるときは、どちらも取り除いて終わります。違いが出るのは、取り除く要素が集合に無いときです。
remove() は KeyError を起こし、discard() は何も起こさず、集合も変わりません。
このページは、集合の要素削除で KeyError が出た人や、2 つのメソッドの使い分けを整理したい人向けです。決まりは、Python 公式ドキュメントの組み込み型(集合型の項)に書かれています。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。
結論
s.remove(x)
x があれば取り除く。無ければ KeyError を起こす。
s.discard(x)
x があれば取り除く。無ければ何もせず、例外も起こさない。
戻り値
どちらも None を返す。取り除いた要素は返らない。
違いを表で確認
| 比較軸 | s.remove(x) | s.discard(x) |
|---|---|---|
| 要素があるとき | s.remove(1):取り除く | s.discard(1):取り除く |
| 要素が無いとき | s.remove(3):KeyError | s.discard(3):何も起こらない |
| 戻り値 | None | None |
| 集合の中身(要素が無いとき) | 例外で止まる(変わらない) | 変わらない |
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
どこで迷っているかを切り分ける
remove() で KeyError が出て止まった人
s.remove(3) は、3 が集合に無いと KeyError です。Python 3.9.6 では KeyError: 3 になりました。あってもなくてもよい要素なら discard() に替えます。
要素が無いのは異常で、気づきたい人
remove() を使います。取り除くつもりの要素が無いときに KeyError で止まるので、入力の取り違えを黙って通さずに済みます。
リストの remove() と同じ感覚で使っている人
リストの remove() も、要素が無いとエラーになります。ただしリストでは ValueError で、集合では KeyError です。集合には、エラーにならない discard() があり、リストには同じ働きのメソッドがありません。
具体例で使い分ける
例 1
要素が無いときの動き
s = {1, 2} に対して、s.discard(3) と s.remove(3) をこの順に実行します。
- 公式ドキュメントは、discard(elem) を、elem が集合にあれば取り除くメソッドと説明しています。3 は無いので、何も起こりません。
- remove(elem) は、elem が集合に無いと KeyError を起こすと書かれています。
結論: discard(3) は何も起こさず、s は {1, 2} のままです。remove(3) は KeyError になります。Python 3.9.6 で同じ結果を確認しました。
例 2
戻り値を使おうとした場合
s = {1, 2} のとき、x = s.remove(1) を実行し、x の値を確かめます。
- remove() は要素を取り除くだけで、取り除いた要素は返しません。
- 要素を取り出して受け取りたいときは、任意の要素を取り除いて返す pop() を使います。pop() は、集合が空だと KeyError を起こします。
結論: x は None で、s は {2} になります。discard() の戻り値も None です。
問題文から答えを選ぶ手順
- 1
要素が無いことがあり得るかを決める
必ずあるはずの要素なら remove()、無いこともある入力なら discard() です。
- 2
無いことに気づきたいかを決める
無いのは異常で止めたいなら remove()、気にせず進めたいなら discard() です。
- 3
取り除いた要素を受け取りたいかを確かめる
受け取りたいなら、どちらでもなく pop() を使います。
試験での見分け方
- 1remove(x) は、x が無いと KeyError を起こす。
- 2discard(x) は、x が無くても何も起こさない。
- 3remove() と discard() の戻り値は、どちらも None である。
- 4リストの remove() は、要素が無いと ValueError を起こす。
誤答しやすい選択肢
discard() も要素が無いと KeyError になると思う
修正: discard() は要素が無くても例外を起こしません。例外が起きるのは remove() です。
remove() の戻り値に、取り除いた要素が入ると思う
修正: 戻り値は None です。要素を受け取りたいときは pop() を使います。
集合の remove() の例外を ValueError と覚える
修正: 集合では KeyError です。ValueError になるのはリストの remove() です。
確認問題
Q1s = {1, 2} のとき、s.discard(3) を実行するとどうなりますか?
答え: 何も起こらない
3 は集合に無いので何も取り除かれず、例外も起きません。s は {1, 2} のままです。
Q2s = {1, 2} のとき、s.remove(3) を実行するとどうなりますか?
答え: KeyError
remove() は、要素が集合に無いと KeyError を起こします。
Q3s = {1, 2} のとき、x = s.remove(1) の x は何ですか?
答え: None
remove() は取り除いた要素を返さず、None を返します。
到達チェック
- 要素が無いときの remove() と discard() の違いを言える
- どちらの戻り値も None だと言える
- リストの remove() の例外が ValueError だと言える
- 取り除いた要素を受け取るには pop() を使うと言える
関連ページで確認する
同じ資格で次に知りたいこと
- dict.get()と d[key] の違い|キーが無いときの KeyError と None(Python3基礎)
d['b'] はキーが無いと KeyError、d.get('b') は None を返し、d.get('b', 0) なら 0 を返します。値が None のキーとキーが無いことの区別も含め、Python 公式ドキュメントの規定、Python 3.9.6 での実行結果、確認問題つきで整理します。
- isdecimal・isdigit・isnumeric の違い|'²' や '½' で結果が分かれる(Python3基礎)
isdecimal() は十進の数字だけ、isdigit() は上付きの '²' も含み、isnumeric() は '½' のような分数も含みます。Python 公式ドキュメントの規定、Python 3.9.6 での実行結果、確認問題つきで整理します。
- split()とpartition()の違い|区切りが無いときの戻り値(Python3基礎)
'key'.split('=', 1) は ['key']、'key'.partition('=') は ('key', '', '') を返します。k, v = の受け取りで ValueError になるのは split だけです。Python 公式ドキュメントの規定、Python 3.9.6 での実行結果、確認問題つきで整理します。
よくある質問
Qdiscard() と remove() はどちらを使えばよいですか?
要素が無くても進めたいなら discard()、無いときに気づきたいなら remove() です。どちらが正しいということはなく、無いときの扱いで選びます。
Q集合から全部の要素を取り除くにはどうしますか?
clear() を使います。公式ドキュメントは、集合からすべての要素を取り除くメソッドと説明しています。
Q集合が空のとき pop() はどうなりますか?
KeyError を起こします。公式ドキュメントに、集合が空のときは KeyError を起こすと書かれています。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: ミナト編集部(運営者情報を見る)
