2016-10-15 8 views
1

ここに私が理解したいコードがあります。私はリストの要素をキーとして使用し、別のリストをデフォルト値として使用して辞書を作成しています。次に、このdictを別のもので更新します。最後に、私はdict内のリストに追加したいと思います。 appendはいくつかの要素に対して何度も起こっています。私はdictのそれぞれの値に対して一度だけ幸せに追加したいと思います。Python:辞書の値であるリストに追加する

l=['a','b','c'] 
bm=dict.fromkeys(l,['-1','-1']) 
u={'a':['Q','P']} 
bm.update(u) 
bm 
# {'a': ['Q', 'P'], 'c': ['-1', '-1'], 'b': ['-1', '-1']} 
for k in bm.keys(): 
    bm[k].append('DDD') 
bm 
# {'a': ['Q', 'P', 'DDD'], 'c': ['-1', '-1', 'DDD', 'DDD'], 'b': ['-1', '-1', 'DDD', 'DDD']} 

私はこのようなcbのために一度発生するDDDを追加期待していた:

​​

答えて

1

この

bm=dict.fromkeys(l,['-1','-1']) 

は、すべてのキーのために同じリスト['-1','-1']を再利用されています説明あなたが目撃している効果。 (辞書のCOMP内のループは[-1,1]リストの別のインスタンスを保証し、各値、のために作成されることを保証し

bm = {x:[-1,1] for x in ['a','b','c']} 

あなたはのdictの理解でこれを行う可能性が望むものを達成する

独立)

全例:

bm = {x:[-1,1] for x in ['a','b','c']} 

u={'a':['Q','P']} 
bm.update(u) 
print(bm) 
for k in bm.keys(): 
    bm[k].append('DDD') 

print(bm) 

結果:

{'c': [-1, 1], 'a': ['Q', 'P'], 'b': [-1, 1]} 
{'c': [-1, 1, 'DDD'], 'a': ['Q', 'P', 'DDD'], 'b': [-1, 1, 'DDD']} 

注:あなたが['-1','-1']毎回の別のインスタンスを作成し、ラムダとdefaultdictを使用することができます存在しないとき、すべてのアクセスキーは、デフォルト値を作成することをしたい場合。

from collections import defaultdict 
bm = defaultdict(lambda : ['-1','-1']) 
+0

説明を明確にするために@ Jean-FrançoisFabre氏に感謝します。 dictの理解を使って、私が望むものを得ることができました。 – Uday

関連する問題