環境設定 数値 文字列 正規表現 リスト タプル 集合 辞書 ループ 関数 クラス データクラス 時間 パス ファイル スクレイピング その他

Pythonの辞書から要素を削除する(del・pop・popitem・clearの違い)

最終更新日 2023.02.18

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 がすべての要素を削除しました。