defaultdictを理解する

collectionsモジュールのdefaultdictについて調べてみら、dictメソッドを上書きして、辞書形式の書き込み可能なインスタンスを返すということがわかった。これを使うと、いちいちその辞書にキーが有るかどうかの処理を書かなくてよくなる。

defaultdict関数の引数に入れたタイプを指定すると自動的にその形式が返ってくる。strだったら””,intだったら0,listだったら[]みたいになる。

例1 (key,val)形式が入っているリストに対してキー名でグルーピングする

from collections import defaultdict

colors = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
d["c"].append("foo")
d["c"].append("hoge")
print(d["c"]) #=> [foo,hoge]


for k, v in colors:
    d[k].append(v)


print(d.items())

#=>[('blue', [2, 4]), ('c', ['foo']), ('b', []), ('yellow', [1, 3]), ('red', [1])]

d は{}を返し、d["key"]は初期値として[]を持っているのでd["c"].append("foo")["foo"]を返す。

例2 文字列から文字の頻度を取得する。

from collections import defaultdict
s = "hello world"
d = defaultdict(int)

for i in range(0,len(s)):
    ch = s[i]
    d[ch] += 1
    sorted_chs = sorted(d.items(),key = lambda x:x[1],reverse=True)
    print(sorted_chs)

#=>[('l', 3), ('o', 2), (' ', 1), ('e', 1), ('d', 1), ('h', 1), ('r', 1),
('w', 1)]

defaultdict(int)によってdに対象のキーが存在していなかったら0を返すようになる。

結論

今まではキーチェックを毎回行っていたけど、これを使ったら今まで書いていたコードが結構減らせそう。これを良いきっかけにして今後はdefaultdictを使ってコードダイエットを積極的に行いたい。

Related Contents

Pickup Contents