Python_collectionsライブラリのdefaultdict #353
Pythonの辞書を扱う際、Keyが予め定まっていれば良いですが、動的にKeyを設定していきたいシーンがあると思います。そんな時、通常の辞書だとKeyErrorが起きてうまく値が入らないケースがありますが、defaultdictを使えば柔軟に対応が可能です。
まず通常の辞書を使って、どういう時にKeyErrorが起きるのか確認します。
最初に辞書を定義します。辞書が複数層になっている部分もありますが、んここではエラーは起きません。
sample_dict = {'color': {'red': 1, 'blue': 2, 'yellow': 3}, 'number': 100}
print(sample_dict)
-------
{'color': {'red': 1, 'blue': 2, 'yellow': 3}, 'number': 100}
複数層の辞書のバリューを更新してみます。ここでもエラーは起きません。
sample_dict['color']['red'] = 99
print(sample_dict)
-------
{'color': {'red': 99, 'blue': 2, 'yellow': 3}, 'number': 100}
辞書にキーバリューを追加してみます。ここでもエラーは起きません。
sample_dict['country'] = 'Japan'
print(sample_dict)
-------
{'color': {'red': 99, 'blue': 2, 'yellow': 3}, 'number': 100, 'country': 'Japan'}
複数層の辞書にキーバリューを追加してみます。ここでもエラーは起きません。
sample_dict['color']['black'] = 4
print(sample_dict)
-------
{'color': {'red': 99, 'blue': 2, 'yellow': 3, 'black': 4}, 'number': 100, 'country': 'Japan'}
今存在しないキーに対して、複数層の辞書を追加してみます。ここでエラーが発生します。
sample_dict['area']['Tokyo'] = 'minatoku'
print(sample_dict)
-------
KeyError: 'area'
バリューが辞書型で、かつキーが存在しない場合にKeyErrorが起きています。つまり辞書の動きとして、複数層の辞書を動的に作成することが難しそうです。
ここで活用できるのが「collections」ライブラリの「defaultdict」です。defaultdictは存在しないキーに対してもデフォルトの値を返す機能を持つ辞書で、複数層の辞書を動的に定義する時に使えます。
from collections import defaultdict
# defaultdictで初期化する
sample_default_dict = defaultdict(dict)
# 複数層の辞書をセットしてみる (普通のdictではKeyErrorになるところ)
sample_default_dict['area']['Tokyo'] = 'minatoku'
sample_default_dict['area']['Osaka'] = 'nishiku'
sample_default_dict['color']['red'] = 1
print(sample_default_dict)
-------
defaultdict(<class 'dict'>, {'area': {'Tokyo': 'minatoku', 'Osaka': 'nishiku'}, 'color': {'red': 1}})
キーが存在しない状態でも、複数層の辞書を作り放題です。ただ、defaultdictはKeyErrorを起こさない分、エラーの温床になりやすいという注意点があります。
そのため、作成が終わったら通常の辞書に直しておくのが良さそうです。
print(dict(sample_default_dict))
-------
{'area': {'Tokyo': 'minatoku', 'Osaka': 'nishiku'}, 'color': {'red': 1}}
dict()は元のデータ自体(ここでのsample_default_dict)は更新しないので、扱う場合は別インスタンスに再代入するなどが必要なのでご注意ください。
ここまでお読みいただきありがとうございました!
参考
この記事が気に入ったらサポートをしてみませんか?