[解決!Python]集合の要素を追加したり削除したりするには解決!Python

集合に要素を追加したり、集合から要素を削除したりするのに使えるメソッドと演算子を紹介する。

» 2023年04月25日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

s = {0, 1, 2}
print(s)  # {0, 1, 2}

# 集合に要素を追加
s.add(3)
print(s)  # {0, 1, 2, 3}

# addメソッドで追加できる要素は一度に1つで、ハッシュ可能なオブジェクトは渡せない
s.add(4, 5# TypeError
s.add([4, 5])  # TypeError

# 複数の要素を集合に加えるにはupdateメソッドか|演算子か|=演算子を使う
s.update({4, 5})
print(s)  # {0, 1, 2, 3, 4, 5}

s.update([6, 7])  # 集合以外の反復可能オブジェクトでもよい
print(s)  # {0, 1, 2, 3, 4, 5, 6, 7}

s2 = s | {8, 9# |演算子は新しい集合オブジェクトを作成する
print(s2)  # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
print(s)  # {0, 1, 2, 3, 4, 5, 6, 7}

s2 = s | [8, 9# TypeError

s |= {8, 9# |=演算子は集合オブジェクト自身を変更する
print(s)  # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

# 集合から要素を削除
s.remove(9)
print(s)  # {0, 1, 2, 3, 4, 5, 6, 7, 8}

s.remove(10# KeyError

s.discard(8)
print(s)  # {0, 1, 2, 3, 4, 5, 6, 7}

s.discard(10# 例外は発生しない
print(s)  # {0, 1, 2, 3, 4, 5, 6, 7}

# 任意の要素を取り出して戻り値とし、その要素を集合から削除
x = s.pop()
print(f'popped {x}, s: {s}'# popped 0, s: {1, 2, 3, 4, 5, 6, 7}

# 複数の要素を集合から削除するには
s = {0, 1, 2, 3, 4, 5, 6}

s.difference_update({5, 6})
print(s)  # {0, 1, 2, 3, 4}

s.difference_update((3, 4))
print(s)  # {0, 1, 2}

# -演算子は新しい集合オブジェクトを作成する
s2 = s - {1, 2}
print(s2)  # {0}
print(s)  # {0, 1, 2}

# -=演算子は集合オブジェクト自身を変更する
s -= {1, 2}
print(s)  # {0}

s -= [0, 1# TypeError

# 集合から全ての要素を削除
s.clear()
print(s)  # set()


集合の要素を追加したり削除したりする方法

 集合に要素を追加するには以下のような方法がある。

メソッド/演算子 説明
addメソッド 要素を1つ追加
updateメソッド 要素を1つ以上追加
|演算子 要素を1つ以上追加。新たな集合を作成
|=演算子 要素を1つ以上追加。集合自身を更新
集合に要素を追加するのに使えるメソッド/演算子

 集合から要素を削除するには以下のような方法がある。

メソッド/演算子 説明
removeメソッド 要素を1つ削除。指定した要素がないと例外が発生
discardメソッド 要素を1つ削除。指定した要素がなくても例外が発生しない
popメソッド 集合から任意の要素を削除し、それを戻り値とする
difference_updateメソッド 要素を1つ以上削除
-演算子 要素を1つ以上削除。新たな集合を作成
-=演算子 要素を1つ以上削除。集合自身を更新
clearメソッド 全ての要素を削除する
集合から要素を削除するのに使えるメソッド/演算子

 以下ではこれらを順に説明する。

要素の追加

 集合に要素を1つだけ追加するにはaddメソッドを使用する。以下に例を示す。

s = {0, 1, 2}
print(s)  # {0, 1, 2}

# 集合に要素を追加
s.add(3)
print(s)  # {0, 1, 2, 3}


 この例では集合sは{0, 1, 2}という3つの要素を持つように初期化されている。その集合に対して、「s.add(3)」を実行することで集合に新たな要素が追加されている。

 addメソッドは引数を1つだけ受け取り、それを集合の要素として追加する。引数の値がすでに集合の要素として格納されていれば、その集合の要素に変化はない。また、集合の要素として格納できるものでなければTypeError例外が発生する。

s.add(4, 5# TypeError
s.add([4, 5])  # TypeError


 上の1つ目の例では複数の引数を渡していることでTypeError例外が発生している。2つ目の例では、リストを集合の要素として追加しようとしているが、リストは集合の要素にはできないのでTypeError例外が発生する。

 複数の要素をまとめて集合に追加したいときにはupdateメソッドか|演算子か|=演算子を使用する。

 以下はupdateメソッドの呼び出し例だ。

s.update({4, 5})
print(s)  # {0, 1, 2, 3, 4, 5}


 この例では先ほどの例でも使用した集合sに対し、引数に{4, 5}という集合を指定してupdateメソッドを呼び出している。その結果、集合sには2つの要素が追加されている。引数に指定した値の中で、既に集合の要素となっているものについては重複することはない。

 なお、updateメソッドには集合以外の反復可能オブジェクトを渡してもよい。以下はその例だ。

s.update([6, 7])  # 集合以外の反復可能オブジェクトでもよい
print(s)  # {0, 1, 2, 3, 4, 5, 6, 7}


 この例では、[6, 7]というリストを渡しているが、2つの整数値が集合に加えられているのが分かるはずだ。

 集合と集合を足し合わせて、それらの和集合を作成するには|演算子を使える。|演算子は2つの集合の和集合となる集合オブジェクトを新しく作成する。

result = {0, 1, 2} | {2, 3, 4}
print(result)  # {0, 1, 2, 3, 4}


 これを使って、集合に新たな要素を追加できる。以下に例を示す。

s2 = s | {8, 9# |演算子は新しい集合オブジェクトを作成する
print(s2)  # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
print(s)  # {0, 1, 2, 3, 4, 5, 6, 7}


 このコード例では、「s | {8, 9}」と|演算子を使って、集合sと{8, 9}という集合の和集合を作成し、その結果を変数s2に代入している。そのため、集合s2の内容は上の式で得られる和集合となり、集合sの内容は以前とは変わらない。

 updateメソッドとは異なり、リストなどの反復可能オブジェクトをオペランドとして置くことはできないことには注意(次に説明する|=演算子でもリストなど、集合以外の反復可能オブジェクトをオペランドとすることはできない)。

s2 = s | [8, 9# TypeError


 |演算子ではなく、|=演算子も同様だが、こちらは代入先の集合オブジェクト自身の内容が変化する(更新される)ことが異なる。以下に例を示す。

s |= {8, 9# |=演算子は集合オブジェクト自身を変更する
print(s)  # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}


要素の削除

 集合から要素を1つだけ削除するには、removeメソッドかdiscardメソッドを使用する。これらは引数に指定した値を集合から削除するが、指定した値が集合に含まれていなかったときの挙動に違いがある。removeメソッドは例外を発生し、discardメソッドは例外を発生しない。

 以下にremoveメソッドの使用例を示す。先ほどまでの例で集合sの内容は{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}のようになっている。

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

s.remove(10# KeyError


 最初に値「9」を指定してremoveメソッドを呼び出している。そのため、集合sからはこれが削除される。次に値「10」を指定してremoveメソッドを呼び出しているが、集合sにこの値は含まれていないのでKeyError例外が発生する。

 これに対して、discardメソッドでは存在しない要素を指定しても例外が発生しない点が異なる。

s.discard(8)
print(s)  # {0, 1, 2, 3, 4, 5, 6, 7}

s.discard(10# 例外は発生しない
print(s)  # {0, 1, 2, 3, 4, 5, 6, 7}


 removeメソッドとdiscardメソッドはどちらも要素を1つだけ削除するものだ。これ以外にも任意の要素を戻り値とするとともに、集合からそれを削除するpopメソッドもある。以下に例を示す。

x = s.pop()
print(f'popped {x}, s: {s}'# popped 0, s: {1, 2, 3, 4, 5, 6, 7}


 なお、集合に要素がない場合、popメソッドはKeyError例外を発生する。

 複数の要素を集合から削除するにはdifference_updateメソッドと-演算子、-=演算子を使う。

 difference_updateメソッドは引数に受け取った集合やその他の反復可能オブジェクトに含まれる要素を集合から削除する。以下にdifference_updateメソッドの使用例を示す。

s = {0, 1, 2, 3, 4, 5, 6}

s.difference_update({5, 6})
print(s)  # {0, 1, 2, 3, 4}


 updateメソッドと同様、difference_updateメソッドは集合以外の反復可能オブジェクトも受け取る。以下に例を示す。

s.difference_update((3, 4))
print(s)  # {0, 1, 2}


 この例ではタプルを渡しているが、問題なく集合からタプルに含めた要素が削除されていることを確認しよう。

 -演算子は、第1オペランドに指定した集合から、第2オペランドに指定した集合に含まれている要素を削除した集合(差集合)を新しく作成する。

result = {0, 1, 2} - {1, 2, 3}
print(result)  # {0}


 この例では第1オペランドに指定した集合は{0, 1, 2}であり、第2オペランドに指定した集合は{1, 2, 3}となっている。この中で重複する要素である{1, 2}が第1オペランドの集合から削除される。

 このことを使用して、集合から1つ以上の特定の要素を削除できる。

s2 = s - {1, 2}
print(s2)  # {0}
print(s)  # {0, 1, 2}


 -演算子は|演算子と同様に、新しく集合を作成する。そのため、上のコード例では集合s2の内容は差集合となり、集合sは以前のままとなっている。

 -=演算子は、|=演算子と同様に代入先の集合オブジェクト自身を変更(更新)する。以下に例を示す。

s -= {1, 2}
print(s)  # {0}


 集合以外の反復可能オブジェクトをオペランドに置くことができないのも|=演算子と同様だ。

s -= [0, 1# TypeError


 最後に集合の全要素を削除するにはclearメソッドを使う。以下に例を示す。

s.clear()
print(s)  # set()


「解決!Python」のインデックス

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。