defaultdictsのリストを初期化する必要があります。たとえば、文字列の場合、これは整然としています。
list_of_dds = [string] * n
…しかし、可変の場合、あなたはそのアプローチですぐに混乱します:
>>> x=[defaultdict(list)] * 3
>>> x[0]['foo'] = 'bar'
>>> x
[defaultdict(<type 'list'>, {'foo': 'bar'}), defaultdict(<type 'list'>, {'foo': 'bar'}), defaultdict(<type 'list'>, {'foo': 'bar'})]
私が欲しいのは、defaultdictsの新しく作成された個別のインスタンスの反復可能です。私がすることができます:
list_of_dds = [defaultdict(list) for i in xrange(n)]
しかし、ここでリスト内包表記を使用すると少し汚く感じます。もっと良いアプローチがあると思います。ある?それが何であるか教えてください。
編集:
これが、リスト内包表記が最適ではないと感じる理由です。私は通常、事前最適化タイプではありませんが、ここで速度の違いを無視することはできません。
>>> timeit('x=[string.letters]*100', setup='import string')
0.9318461418151855
>>> timeit('x=[string.letters for i in xrange(100)]', setup='import string')
12.606678009033203
>>> timeit('x=[[]]*100')
0.890861988067627
>>> timeit('x=[[] for i in xrange(100)]')
9.716886043548584