2016-10-15 80 views
1

這是我想了解的代碼。我創建一個字典使用列表中的元素作爲鍵和另一個列表作爲默認值。然後用另一個更新這個字典。最後,我想在字典中追加列表。對於某些元素,附加操作會發生多次。我想爲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']} 

我期待附加DDDcb這樣發生一次:

​​

回答

1

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

是重複使用同一個列表['-1','-1']所有密鑰,這也解釋了你目擊的效果。

達到你願意,你可以用字典理解做什麼

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

(在字典補償範圍內的循環確保[-1,1]列表的不同實例的每一個值,從而保證創建獨立)

完整的示例:

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']} 

注意:如果你想,所有的訪問鍵創建一個默認值時,不存在你可以使用defaultdict與創造的每一次['-1','-1']不同的實例拉姆達。

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

謝謝@ Jean-FrançoisFabre的澄清。使用詞典理解我可以得到我想要的。 – Uday

相關問題