【便利】pythonでのdefaultdictの使い方
概要
Pythonのdict型は{key: value}のペアを保持するが、存在しないkeyに対しての操作はできない。 このような場合はdefaultdictを利用すると便利な場合がある。
通常のdict
pythonで辞書型のdictを使うと新しいkeyに対して毎回初期化を行う必要がある。
例えば、以下のようなリストの各要素の出現数を数えてみる際に各keyに対して初期化をしないと、、、
d = {} x_list = [1, 2, 3, 4, 1] for key in x_list: d[key]+=1 # Traceback (most recent call last): # File "<stdin>", line 2, in <module> # KeyError: 1
とKeyError
が発生する。
このようにdictは存在しないキーに対して操作を行うとエラーが発生する。
したがって、この場合は、キーが存在するかを確認してキーを生成する必要がある。
d = {} x_list = [1, 2, 3, 4, 1] for key in x_list: if key not in d: #キーが存在しない場合の処理 d[key] = 0 d[key]+=1
defaultdictを使ってみる
defaultdictではdictの初期化を勝手にやってくれるので、毎回キーの存在確認をする必要がない。
from collections import defaultdict d = defaultdict(int) x_list = [1, 2, 3, 4, 1] for key in x_list: d[key] +=1 print(d) # defaultdict(<class 'int'>, {1: 2, 2: 1, 3: 1, 4: 1})
defaultdictのインスタンスを生成するときの引数には"初期化時に実行する関数"を記述する。 上記の例のように「int」と記述した場合は「lambda: int()」, 「lambda: 0」と同じ意味になる。
from collections import defaultdict d = defaultdict(lambda: 0) x_list = [1, 2, 3, 4, 1] for key in x_list: d[key] +=1 print(d) # defaultdict(<function <lambda> at 0x00...>, {1: 2, 2: 1, 3: 1, 4: 1})
またdefaultdictにはlist()やfloat(), dict()といった関数を渡すこともできる。 list()の場合で試してみると,
d = defaultdict(list) for key in x_list: d[key].append(key) print(d) # defaultdict(<class 'list'>, {1: [1, 1], 2: [2], 3: [3], 4: [4]})
のようにlistの要素に追加することができる。