AI資格ドリル
資格を選ぶ↓

用語比較

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):KeyErrors.discard(3):何も起こらない
戻り値NoneNone
集合の中身(要素が無いとき)例外で止まる(変わらない)変わらない

Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)

試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

remove() で KeyError が出て止まった人

s.remove(3) は、3 が集合に無いと KeyError です。Python 3.9.6 では KeyError: 3 になりました。あってもなくてもよい要素なら discard() に替えます。

02

要素が無いのは異常で、気づきたい人

remove() を使います。取り除くつもりの要素が無いときに KeyError で止まるので、入力の取り違えを黙って通さずに済みます。

03

リストの 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. 1

    要素が無いことがあり得るかを決める

    必ずあるはずの要素なら remove()、無いこともある入力なら discard() です。

  2. 2

    無いことに気づきたいかを決める

    無いのは異常で止めたいなら remove()、気にせず進めたいなら discard() です。

  3. 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() を使うと言える

同じ資格で次に知りたいこと

よくある質問

Qdiscard() と remove() はどちらを使えばよいですか?

A

要素が無くても進めたいなら discard()、無いときに気づきたいなら remove() です。どちらが正しいということはなく、無いときの扱いで選びます。

Q集合から全部の要素を取り除くにはどうしますか?

A

clear() を使います。公式ドキュメントは、集合からすべての要素を取り除くメソッドと説明しています。

Q集合が空のとき pop() はどうなりますか?

A

KeyError を起こします。公式ドキュメントに、集合が空のときは KeyError を起こすと書かれています。

次に見る比較

執筆: ミナト編集部(運営者情報を見る)