Developer

【Python独学】セット(集合)に要素を追加・削除する
2020.11.02
Lv1

【Python独学】セット(集合)に要素を追加・削除する

前回扱ったセット(集合)について、今回は
・要素の追加する
・要素の削除する
方法についてみていきましょう。


要素の追加

前回説明したとおり、セットは複数の値をまとまった1つのデータとして扱うデータ型です。
リストと同じように、値をあとから追加したり、削除したりするためのメソッドが用意されています。
セットへの要素の追加には add() を使います。
add() では、引数として与えた値がセットの要素として追加されます。
それでは例を見てみましょう。

set_test = set()                ### 空集合を作成
print(set_test)

set_test.add("Django")          ### 要素を追加
print(set_test)
C:\Python> python 9-1.py
set()
{‘Django’}


上記の例では、1行目で空集合を作成しています。そして、3行目で空集合に対して add() で要素を追加しました。

セット型の特徴の1つとして、重複した値を持たないことは前回説明したと思います。
では、既に存在する要素と同じものを add() で追加した場合どうなるでしょうか?

set_test = {"Django"}
set_test.add("Django")          ### 重複する要素を追加

print(set_test)
C:\Python> python 9-1.py
{‘Django’}

以上のようにエラーにはならず、重複した値が登録されることもありません。
前回、リストやタプルに重複した値が含まれた状態で set() を使用してセットにした場合、
重複した値が取り除かれていたのは確認したと思います。
それと同じように、既にある要素と重複する要素が追加された場合は、重複する値として
要素が追加されないようになっており、かつエラーも出ないようになっています。

ただし、要素の重複はあくまで全く同じ要素に限ります。
例えば、int型の「1」とstr型の「1」は見た目は同じ「1」ですが、データ型が異なるため同じ要素としては扱われません。
セットは、格納された要素をハッシュ化して保持していて、ハッシュ化した際の値が同じものを
重複した要素と判断しているため、データ型が異なる値は重複した値と判断されません。

test= {"1"}
test.add(1)

print(test)
C:\Python> python 9-1.py
{1, ‘1’}

要素の削除

次に、要素を削除するメソッドをみてみましょう。
要素の削除には、大きく分けて3つの方法があります。
・要素を指定して削除する
・任意の要素を1つ削除する
・全要素を削除する


要素を指定して削除する

セットから要素を指定して削除するには、remove()discard() を使用します。
これらのメソッドでは、削除したい要素そのものを引数に指定します。
どちらも同じように要素を指定しますが、remove()は指定した要素がなかった場合エラーを出力します。
discard()は指定した要素がなかった場合でも、エラーにならないという違いがあります。
では、実際に試してみましょう。

set_test = {"Django", "Flask", "Bottle"}
set_test.remove("Django")          ### 削除したい要素を引数に指定

print(set_test)

set_test.discard("Flask")          ### 削除したい要素を引数に指定

print(set_test)
C:\Python> python 9-1.py
{‘Flask’, ‘Bottle’}
{‘Bottle’}

以上のように、存在する要素を引数として指定した場合は、どちらのメソッドも同じようにセットから要素を削除します。
また、指定する要素を変数に入れておき、remove()/discard() の引数として変数を使用することもできます。

set_test = {"Django", "Flask", "Bottle"}

item_remove = "Django"          ### 削除したい要素を変数に代入
item_discard = "Flask"

set_test.remove(item_remove)            ### 引数として変数を指定
print(set_test)

set_test.discard(item_discard)          ### 引数として変数を指定
print(set_test)
C:\Python> python 9-1.py
{‘Flask’, ‘Bottle’}
{‘Bottle’}

存在しない要素を指定した際は、下の例のように挙動が変わります。
remove() の場合

set_test = {"Django", "Flask", "Bottle"}
set_test.remove("Python")

print(set_test)
C:\Python> python 9-1.py
Traceback (most recent call last):
File “9-1.py”, line 2, in
set_test.remove(“Python”)
KeyError: ‘Python’
discard() の場合

set_test = {"Django", "Flask", "Bottle"}
set_test.discard("Python")

print(set_test)
C:\Python> python 9-1.py
{‘Flask’, ‘Bottle’, ‘Django’}

なお、セットにある要素が含まれているか、含まれていないかはin演算子not in演算子で判断できます。

要素 in セット型のオブジェクト :要素がセットに含まれていればTrue、含まれていなければFalseを返す
要素 not in セット型のオブジェクト :要素がセットに含まれていなければTrue、含まれていればFalseを返す

例を見てみましょう。

set_test = {"Django", "Flask", "Bottle"}

result1 = "Django" in set_test               ### "Django"が含まれていればTrue
result2 = "Python" not in set_test           ### "Python"が含まれていなければTrue

print(set_test)
print(result1)
print(result2)
C:\Python> python 9-1.py
{‘Flask’, ‘Bottle’, ‘Django’}
True
True

これらの演算子を使うと、remove() を使用する際に事前に削除する要素があるか確認することができます。
ifを使用して、要素がなかった際にエラーを出すのではなく、メッセージを表示させるよう分岐させてみました。

set_test = {"Django", "Flask", "Bottle"}

print(set_test)

item = input("削除する要素:")

if item in set_test:
    set_test.remove("Django")
    print(set_test)
else:
    print(item + " は含まれていません")
C:\Python> python 9-1.py
{‘Django’, ‘Flask’, ‘Bottle’}
削除する要素:Python
Python は含まれていません

discard() の場合はエラーにならないので、削除したい値がセットに含まれていない場合に、
特にエラーなど出さずにそのまま処理を進めたい場合はdiscard() を使用するなど、
用途に応じた使い分けが必要になります。


任意の要素を1つ削除する

リストのメソッドである pop() ですが、セットでも使用できます。
ただし、リストで使用した場合と異なりインデックスを指定できないので、
集合が持つ要素の中から任意の要素を取り出して削除する、といった処理になります。

set_test = {"Django", "Flask", "Bottle"}

print(set_test)

item = set_test1.pop()

print(item)
print(set_test)
C:\Python> python 9-1.py
{‘Bottle’, ‘Flask’, ‘Django’}
Bottle
{‘Flask’, ‘Django’}
C:\Python> python 9-1.py
{‘Flask’, ‘Django’, ‘Bottle’}
Flask
{‘Django’, ‘Bottle’}

上記の例を何度か繰り返してみてください。削除する値が変わっているのがわかると思います。


全要素を削除する

セットが持つ要素すべてを削除するメソッドが clear() です。

set_test = {"Django", "Flask", "Bottle"}
set_test.clear()

print(set_test)
C:\Python> python 9-1.py
set()

表示しようとした集合が空集合であることを示す set() が表示されました。
セットが持っていた要素が全て削除されていることが確認できます。


まとめ

・要素の追加は add()
・要素の削除は remove()/discard()/pop()
・要素の全削除は clear()
・要素が含まれているか判断するときは in/not in演算子


確認問題

集合とwhileを組み合わせて、入力した要素を集合に追加/削除できるプログラムを作ってみましょう。
以下のような表示から、1を入力すると追加、2を入力すると削除、
3を入力すると要素の表示、4を入力するとプログラムを終了するようにします。

また、追加/削除の際はinput()を用いて以下のように手動で入力できるようにします。

余裕があれば、入力した値をint型に変換して、数字以外の値が入力された場合は
エラー処理を行えるようにしてみましょう。

回答例はこちらの記事の最後に!
【Python連載】セットの操作&frozenset型について


前回の確認問題の回答例

前回の記事はこちら → 【Python連載】セット(集合)の特徴と作成

回答例では、通常通り要素を並べて {} でセットを作成する方法と、
タプルとして定義して set() で作成する方法を載せています。

### {}で作成するパターン
set_a = {"セット型", 100, "Django", "Flask", "Bottle", "Django", 100}
print(set_a)

### set() で作成するパターン
tuple1 = ("セット型", 100, "Django", "Flask", "Bottle", "Django", 100)
set_b = set(tuple1)
print(set_b)

連載目次

独学で学ぶ Pythonプログラミング 連載目次