5.3.3.1 defaultdict の使用例

listdefault_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_factoryint にすると、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_factoryset に設定することで、 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]))]
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。