2017-08-08 12 views
0

こんにちは、fromkeysメソッドを使用してネストされた辞書を作成すると、ネストされたdictが作成されないというのが不思議でした。.fromkeysでネストされたdictを開始する

x=[1,2,3,4,5] 
y=[7,8,9,10,11] 
zx=dict.fromkeys(x,dict.fromkeys(y,0)) 

これは、ネストされた辞書を作成しますが、あなたはそれを

ZXを更新しようとすると、[1]〜[8] + = 1

をそれは、キー8を持っているすべてのouterkeysのすべての値を更新します。

あなたがすべて KEを関連付けられているため、ネストされた辞書

+0

。 –

答えて

1

を作るために、この機能を使用する場合、これはなぜ起こったか、私は思っていました外側の辞書のysはと同じの内部辞書です。最初にdict.fromkeys(y,0)の辞書を作成し、その辞書にすべてのキーを関連付けます。dict.fromkeys(x,...)。これは全く同じに見えますが、そうではありません

zx = {k: dict.fromkeys(y,0) for k in x} 

:ここで、我々はためx内のすべてのkdict.fromkeys(y,0)を評価し、必要な辞書を構築する

方法は、例えば辞書理解です再び。結果として、構築された辞書は全て相当のですが、ではなくと同じオブジェクトになります。

今、私たちは期待を取得:あなたは*同じ*値ですべてのキーを関連付けられているため

>>> x=[1,2,3,4,5] 
>>> y=[7,8,9,10,11] 
>>> zx = {k: dict.fromkeys(y,0) for k in x} 
>>> zx 
{1: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 2: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 3: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 4: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 5: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}} 
>>> zx[1][8]+=1 
>>> zx 
{1: {8: 1, 9: 0, 10: 0, 11: 0, 7: 0}, 2: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 3: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 4: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 5: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}} 
+0

あなたはunhashable型のリストを取得しませんか?リストタプルを作る必要がありますか? – user6656104

+0

@ user6656104:キーはリストではなく、キーはリストの*要素*です。これらの要素がハッシュ可能(int、文字列など)の場合、問題はありません。 –

+0

ああ、ありがとう – user6656104

関連する問題