Pythonで辞書の要素を削除するclear, pop, popitem, del
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'
条件を満たす要素を削除・抽出: 辞書内包表記
辞書から条件を満たす要素を削除するには、リスト内包表記の辞書版である辞書内包表記を使う。
- 関連記事: Pythonリスト内包表記の使い方
「条件を満たす要素を削除」する処理は「条件を満たさない要素を抽出」する処理と同じなので、例えば、「値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}
and
やor
を使うと複数の条件を指定できる。
dc = {k: v for k, v in d.items() if v % 2 == 0 and k.endswith('e')}
print(dc)
# {'orange': 100}