【便利】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の要素に追加することができる。