Python:附加到列表,这是字典的值

时间:2016-10-15 12:46:50

标签: python

以下是我想了解的代码。我正在创建一个dict,使用列表元素作为键,另一个列表作为默认值。然后用另一个更新这个dict。最后,我想在dict中附加到列表中。对于某些元素,追加发生了多次。对于dict的每个值,我想只为了一次快乐。

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

我希望在DDDc之后添加b一次,如下所示:

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

1 个答案:

答案 0 :(得分:1)

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

为所有键重复使用相同的列表['-1','-1'],这解释了您正在目睹的效果。

达到你想要的效果 dict comprehension

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

(dict comp中的循环确保为每个值创建[-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与lambda一起使用,每次都会创建['-1','-1']的不同实例。

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