Pythonの辞書から要素を削除する(del・pop・popitem・clearの違い)
Python の辞書から要素を削除するときは del や pop を使います。
- 指定したキーのペアを削除したい … del・pop
- 最後のペアを削除したい … popitem
- すべてを削除したい … clear
Python の del で削除する
辞書から一つの要素を削除するには del を使います。
d = {'apple': 3, 'lemon': 7, 'peach': 1}
del d['apple']
print(d) # {'lemon': 7, 'peach': 1}
print(type(d)) # <class 'dict'>
もし削除する要素がなかったらエラーになります。
d = {'apple': 3, 'lemon': 7, 'peach': 1}
del d['banana']
print(d) # KeyError: 'banana'
None の削除もエラーです。
d = {'apple': 3, 'lemon': 7, 'peach': 1}
del d[None]
print(d) # KeyError: None
空文字もエラー。
d = {'apple': 3, 'lemon': 7, 'peach': 1}
del d['']
print(d) # KeyError: ''
複数の要素を削除するときはカンマで区切ります。
d = {'apple': 3, 'lemon': 7, 'peach': 1}
del d['apple'], d['lemon']
print(d) # {'peach': 1}
2 回続けて同じ要素を削除しようとするとエラーになります。
d = {'apple': 3, 'lemon': 7, 'peach': 1}
del d['apple'], d['apple']
print(d) # KeyError: 'apple'
del は Python の「グローバルな関数」で、辞書に限らずさまざまなものを削除します。
pop で削除する
pop は辞書のメソッドで、引数にキーを指定して削除します。
d = {'apple': 3, 'lemon': 7, 'peach': 1}
r = d.pop('lemon')
print(d) # {'apple': 3, 'peach': 1}
print(r) # 7
pop は自身を変え、削除したペアの値を返します。r の 7 は lemon の 7 です。
存在しない要素を削除しようとするとエラーです。
d = {'apple': 3, 'lemon': 7, 'peach': 1}
d.pop('banana')
print(d) # KeyError: 'banana'
このエラーを回避するには pop の第二引数に None を入れます。
d = {'apple': 3, 'lemon': 7, 'peach': 1}
r = d.pop('banana', None)
print(d) # {'apple': 3, 'lemon': 7, 'peach': 1}
print(r) # None
エラー処理のために例外処理の構文をつけるのは冗長です。try よりも pop の第二引数になにかを入れましょう。実は、第二引数に入れるものは None である必要はありません。この仕組みをもう少し調べてみましょう。
d = {'apple': 3, 'lemon': 7, 'peach': 1}
r = d.pop('banana', 'Banana is none')
print(d) # {'apple': 3, 'lemon': 7, 'peach': 1}
print(r) # Banana is none
第二引数に文字列 Banana is none を入れたら、pop は Banana is none を返しました。では存在する要素を削除するときに、第二引数になにかを入れていたらどうでしょうか?
d = {'apple': 3, 'lemon': 7, 'peach': 1}
r = d.pop('apple', 'Banana is none')
print(d) # {'apple': 3, 'lemon': 7, 'peach': 1}
print(r) # 3
Banana is none でなく apple の値である 3 が返りました。
また pop は複数個の削除に対応していません。
d = {'apple': 3, 'lemon': 7, 'peach': 1}
d.pop('lemon', 'peach')
print(d) # {'apple': 3, 'peach': 1}
peach が削除されていません。
popitem で削除する
popitem も辞書の関数ですが、名前に反して pop とかなりふるまいが違います。まったく別の関数と理解しましょう。
d = {'apple': 3, 'lemon': 7, 'peach': 1}
r = d.popitem()
print(d) # {'apple': 3, 'lemon': 7}
print(r) # ('peach', 1)
popitem は LIFO(Last In First Out、後入れ先出し)にしたがってペアを削除します。上のコードで最も後に入ったペアは 'peach': 1 なので、このペアが削除されています。
popitem は削除したペアをタプルで返します。ちなみに次のコードはエラーです。
d = {'apple': 3, 'lemon': 7, 'peach': 1}
r = d.popitem('apple')
# TypeError: popitem() takes no arguments (1 given)
popitem は引数をとらないと警告しています。
clear ですべての要素を削除する
d = {'apple': 3, 'lemon': 7, 'peach': 1}
d.clear()
print(d) # {}
clear がすべての要素を削除しました。