defaultdict を使うのだ
collections.defaultdictを使うと要素のカウントがシンプルに書けるね。
# Python 2.5 from collections import defaultdict d = defaultdict(int) s = "abrakadabra" # 文字別にカウント for i in s: d[i] += 1 # 結果表示 for k, v in d.iteritems(): print k, v # 結果 # a 5 # r 2 # b 2 # k 1 # d 1
defaultdictの第1引数にはファクトリ関数を指定する。つまり「呼んだら新しいオブジェクトを戻り値として返すようなブツ」を入れろということだ。ビルトインなファクトリ関数には次のようなものがある:
>>> int() 0 >>> float() 0.0 >>> list() [] >>> set() set([])
defaultdictの第1引数に0とか[]を直接指定しない理由はおそらく、listとかsetなどの可変(mutable)オブジェクトを指定されると、いちいちimport copy; copy.copy( )する必要が出てくるからだと思う。
ちなみにdefaultdictを使わないで書くと、いちいち値の存在を確認するか:
d = {} s = "abrakadabra" for i in s: if i in d: d[i] += 1 else: d[i] = 1
getメソッドを使う羽目になる:
d = {} s = "abrakadabra" for i in s: d[i] = d.get(i, 0) + 1