Pythonで辞書の要素を削除するclear, pop, popitem, del

Modified: | Tags: Python, 辞書

Pythonで辞書(dict型オブジェクト)の要素を削除するには、clear(), pop(), popitem()メソッドやdel文を使う。辞書内包表記で条件を満たす要素を一括で削除することもできる。

辞書に要素を追加する方法については以下の記事を参照。

辞書のすべての要素を削除(初期化): clear()メソッド

clear()メソッドを呼ぶと辞書オブジェクトのすべての要素が削除(初期化)され、空の辞書になる。

d = {'k1': 1, 'k2': 2, 'k3': 3}

d.clear()
print(d)
# {}

辞書のキーを指定して要素を削除し、値を返す: pop()メソッド

pop()メソッドは引数にキーkeyを指定してその要素を削除し、削除された値valueを返す。

d = {'k1': 1, 'k2': 2, 'k3': 3}

removed_value = d.pop('k1')
print(d)
# {'k2': 2, 'k3': 3}

print(removed_value)
# 1

デフォルトでは存在しないキーを指定するとエラー(KeyError)となる。

d = {'k1': 1, 'k2': 2, 'k3': 3}

# removed_value = d.pop('k4')
# print(d)
# KeyError: 'k4'

第二引数を指定するとキーが存在しない場合にその値を返す。辞書オブジェクト自体は変化なし。

d = {'k1': 1, 'k2': 2, 'k3': 3}

removed_value = d.pop('k4', None)
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3}

print(removed_value)
# None

辞書の要素を削除し、キーと値を返す: popitem()メソッド

popitem()メソッドは辞書の要素を削除し、そのキーkeyと値valueのタプル(key, value)を返す。

Python3.7以降は辞書の順序が保持されるようになっており、popitem()はLIFO(後入れ先出し)で要素を削除する。最後に追加された要素から順に削除されていく。

空の辞書オブジェクトに対してはエラー(KeyError)となる。

d = {'k1': 1, 'k2': 2}

k, v = d.popitem()
print(k)
print(v)
print(d)
# k2
# 2
# {'k1': 1}

k, v = d.popitem()
print(k)
print(v)
print(d)
# k1
# 1
# {}

# k, v = d.popitem()
# KeyError: 'popitem(): dictionary is empty'

辞書のキーを指定して要素を削除(複数指定可): del文

del文を使って辞書の要素を削除することも可能。辞書オブジェクト[キー]の形で指定する。

d = {'k1': 1, 'k2': 2, 'k3': 3}

del d['k2']
print(d)
# {'k1': 1, 'k3': 3}

複数の要素を指定できる。

d = {'k1': 1, 'k2': 2, 'k3': 3}

del d['k1'], d['k3']
print(d)
# {'k2': 2}

存在しないキーkeyを指定するとエラー(KeyError)となる。

d = {'k1': 1, 'k2': 2, 'k3': 3}

# del d['k4']
# print(d)
# KeyError: 'k4'

条件を満たす要素を削除・抽出: 辞書内包表記

辞書から条件を満たす要素を削除するには、リスト内包表記の辞書版である辞書内包表記を使う。

「条件を満たす要素を削除」する処理は「条件を満たさない要素を抽出」する処理と同じなので、例えば、「値valueが奇数の要素を削除」するには「値valueが偶数の要素を抽出」すればよい。逆も同様。

d = {'apple': 1, 'banana': 10, 'orange': 100}

dc = {k: v for k, v in d.items() if v % 2 == 0}
print(dc)
# {'banana': 10, 'orange': 100}

dc = {k: v for k, v in d.items() if v % 2 == 1}
print(dc)
# {'apple': 1}

辞書のitems()メソッドでキーkeyと値valueを取り出している。

キーkeyに対して条件を指定することも可能。

dc = {k: v for k, v in d.items() if k.endswith('e')}
print(dc)
# {'apple': 1, 'orange': 100}

dc = {k: v for k, v in d.items() if not k.endswith('e')}
print(dc)
# {'banana': 10}

andorを使うと複数の条件を指定できる。

dc = {k: v for k, v in d.items() if v % 2 == 0 and k.endswith('e')}
print(dc)
# {'orange': 100}

関連カテゴリー

関連記事