辞書を便利にするdefualtdict

入門Python3 5.5.1


ここから標準ライブラリの便利な機能をいくつか紹介されていました。

まずはdefaultdictです。

例えば辞書を使って何かしら出現回数を計算するようなものを実装したい場合

ary = ['foo','bar','baz','foo','hoge']

counter = {}

# aryに含まれる文字列の出現回数を計算する
for word in ary:
    if not word in counter:
        counter[word] = 0
    counter[word] += 1

print(counter)
$ py main.py
{'foo': 2, 'bar': 1, 'baz': 1, 'hoge': 1}

このようにループ中でcounterの中にキーが存在してるかチェックして初期化する必要があります。


この処理をdefaultdictを使えば以下のように書くことができます。

from collections import defaultdict

ary = ['foo','bar','baz','foo','hoge']

def defaultvalue():
    return 0

# defaultdictを使って辞書を宣言
counter = defaultdict(defaultvalue)

# aryに含まれる文字列の出現回数を計算する
for word in ary:
    counter[word] += 1

print(counter)
$ py main.py
defaultdict(<function defaultvalue at 0x0000000002063E18>, {'foo': 2, 'bar': 1, 'baz': 1, 'hoge': 1})

まずcollectionsのdefaultdictを読み込みます。

次にdefaultdictへの引数としてdefaultvalueという独自に定義した関数を渡しています。

そうするとcounterの存在しないキーに対して値を設定した場合に例外が発生せず、その代わりにdefaultvalueが呼ばれてその戻り値が設定されるというかんじです。

これを使えばループ中にわざわざ初期化のためのコードを書く必要がないのでとても便利ですね。


ちなみに0で初期化するだけなら以下のように書く方が簡素です。

# 無名関数で0を返す
counter = defaultdict(lambda: 0)

# もしくは、int関数の戻りは0なのでint関数を渡す
counter = defaultdict(int)