2016-10-15 81 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

相关问题