listをdefault_factoryとすることで、キー=値ペアのシー ケンスをリストの辞書へ簡単にグループ化できます。
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] >>> d = defaultdict(list) >>> for k, v in s: d[k].append(v) >>> d.items() [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
それぞれのキーが最初に登場したとき、マッピングにはまだ存在しません。 そのためエントリはdefault_factory関数が返す空のlist を使って自動的に作成されます。 list.append()操作は新しいリストに紐付けられます。 キーが再度出現下場合には、通常の参照動作が行われます(そのキーに対応す るリストが返ります)。そして list.append()操作で別の値をリスト に追加します。このテクニックはdict.setdefault()を使った等価な ものよりシンプルで速いです:
>>> d = {} >>> for k, v in s: d.setdefault(k, []).append(v) >>> d.items() [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
default_factory を int にすると、defaultdict を(他の言語の bag や multisetのように)要素の数え上げに便利に使うことができます:
>>> s = 'mississippi' >>> d = defaultdict(int) >>> for k in s: d[k] += 1 >>> d.items() [('i', 4), ('p', 2), ('s', 4), ('m', 1)]
最初に文字が出現したときは、マッピングが存在しないので default_factory 関数が int()を呼んでデフォルトのカ ウント0 を生成します。インクリメント操作が各文字を数え上げます。 このテクニックは以下の dict.get()を使った等価なものよりシンプ ルで速いです:
>>> d = {} >>> for k in s: d[k] = d.get(k, 0) + 1 >>> d.items() [('i', 4), ('p', 2), ('s', 4), ('m', 1)]
default_factory を set に設定することで、 defaultdictをセットの辞書を作るために利用することができます:
>>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)] >>> d = defaultdict(set) >>> for k, v in s: d[k].add(v) >>> d.items() [('blue', set([2, 4])), ('red', set([1, 3]))]