106

リストのディクショナリをプログラムで作成しようとしても、ディクショナリ キーを個別に指定できません。リストのディクショナリを作成して 1 つのキーに追加しようとすると、すべてのリストが更新されます。非常に単純なテスト ケースを次に示します。

data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data

実結果:{0: ['hello'], 1: ['hello']}

期待される結果:{0: [], 1: ['hello']}

これが機能するものです

data = {0:[],1:[]}
data[1].append('hello')
print data

実際の結果と期待される結果:{0: [], 1: ['hello']}

fromkeysメソッドが期待どおりに機能しないのはなぜですか?

4

4 に答える 4

130

[]に2番目の引数として渡すとdict.fromkeys()、かなり役に立たない結果になります。ディクショナリ内のすべての値は同じリストオブジェクトになります。

Python 2.7以降では、代わりに二分法の理解を使用できます。

data = {k: [] for k in range(2)}

以前のバージョンのPythonでは、次を使用できます

data = dict((k, []) for k in range(2))
于 2012-07-16T17:50:49.670 に答える
104

代わりにdefaultdictを使用してください。

from collections import defaultdict
data = defaultdict(list)
data[1].append('hello')

このように、リストに使用するすべてのキーを事前に初期化する必要はありません。

あなたの例で起こっていることは、1つの(可変の)リストを使用することです:

alist = [1]
data = dict.fromkeys(range(2), alist)
alist.append(2)
print data

出力します{0: [1, 2], 1: [1, 2]}

于 2012-07-16T17:50:10.870 に答える
9

辞書に単一のリストへの参照を入力しているため、更新すると、更新はすべての参照に反映されます。代わりに辞書の理解を試してください。Pythonでリスト内包表記を使用して辞書を作成するを参照 してください。

d = {k : v for k in blah blah blah}
于 2012-07-16T17:50:42.740 に答える