セット.add() / セット.remove() / セット.discard()
| 対応: | Python 2(2000) |
|---|
セットへの要素の追加・削除を行うメソッドです。セットは重複のない要素の集合で、要素の有無を高速に確認できます。
構文
# 要素を追加する セット.add(要素) # 要素を削除する(存在しない場合はエラー) セット.remove(要素) # 要素を削除する(存在しない場合は何もしない) セット.discard(要素) # ランダムな要素を取り出して削除する セット.pop() # 全要素を削除する セット.clear()
メソッド一覧
| メソッド | 概要 |
|---|---|
| セット.add(要素) | セットに要素を追加します。すでに同じ要素が存在する場合は何もしません。 |
| セット.remove(要素) | 指定した要素をセットから削除します。要素が存在しない場合は『KeyError』が発生します。 |
| セット.discard(要素) | 指定した要素をセットから削除します。要素が存在しない場合でもエラーにならず何もしません。 |
| セット.pop() | セットから任意の要素を1つ取り出して削除し、その要素を返します。セットが空の場合は『KeyError』が発生します。 |
| セット.clear() | セットのすべての要素を削除して空のセットにします。 |
| セット.update(イテラブル) | イテラブル(リスト・別のセットなど)の全要素を追加します。 |
サンプルコード
set_add_basic.py
fighters = {'孫悟空', 'ベジータ'}
fighters.add('ブルマ')
print(fighters)
fighters.add('孫悟空')
print(len(fighters))
実行すると次のように出力されます。
python3 set_add_basic.py
{'孫悟空', 'ブルマ', 'ベジータ'}
3
set_remove_discard.py
fighters = {'孫悟空', 'ベジータ', 'ブルマ'}
fighters.remove('ベジータ')
print(fighters)
try:
fighters.remove('フリーザ')
except KeyError as e:
print('エラー: ' + str(e))
fighters.discard('フリーザ')
print(fighters)
実行すると次のように出力されます。
python3 set_remove_discard.py
{'孫悟空', 'ブルマ'}
エラー: 'フリーザ'
{'孫悟空', 'ブルマ'}
set_update_pop_clear.py
fighters = {'孫悟空', 'ブルマ'}
new_members = ['クリリン', '孫悟空', 'ピッコロ']
fighters.update(new_members)
print(fighters)
removed = fighters.pop()
print('取り出した要素: ' + removed)
fighters.clear()
print(fighters)
実行すると次のように出力されます。
python3 set_update_pop_clear.py
{'孫悟空', 'ブルマ', 'クリリン', 'ピッコロ'}
取り出した要素: 孫悟空
set()
よくあるミス
よくあるミス1: remove()で存在しない要素を削除するとKeyErrorになる
『remove()』は指定した要素がセットに存在しない場合に『KeyError』を発生させます。要素が存在するか確認してから削除するか、エラーを無視したい場合は『discard()』を使います。
mistake1_ng.py
fighters = {'孫悟空', 'ベジータ'}
fighters.remove('フリーザ')
実行すると次のように出力されます。
python3 mistake1_ng.py KeyError: 'フリーザ'
mistake1_ok.py
fighters = {'孫悟空', 'ベジータ'}
fighters.discard('フリーザ')
print(fighters)
実行すると次のように出力されます。
python3 mistake1_ok.py
{'孫悟空', 'ベジータ'}
よくあるミス2: setにリストなど追加できない型を追加しようとする
セットに追加できる要素はハッシュ可能な型(文字列・数値・タプルなど)に限られます。リストや辞書などのミュータブルな型を『add()』しようとすると『TypeError』が発生します。
mistake2_ng.py
data = set() data.add(['孫悟空', 'ベジータ'])
実行すると次のように出力されます。
python3 mistake2_ng.py TypeError: unhashable type: 'list'
mistake2_ok.py
data = set()
data.add(('孫悟空', 'ベジータ'))
print(data)
実行すると次のように出力されます。
python3 mistake2_ok.py
{('孫悟空', 'ベジータ')}
概要
セットはリストと異なり順序を持たず、重複した要素を持てません。そのため要素の追加・削除・存在確認がリストよりも高速です。要素の削除には『remove()』と『discard()』の2種類があります。削除する要素が存在しない場合にエラーを発生させたいときは『remove()』を、エラーを無視したいときは『discard()』を使えます。
セットは順序を保証しないため、『pop()』でどの要素が取り出されるかは不定です。特定の要素を取り出したい場合はセットではなくリストやデック(collections.deque)を使えます。
セットの集合演算(和・積・差)は『セット.union() / セット.intersection() / セット.difference()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。