我有2个字典,格式如下:
a = {'steve': [1, 'jones'], 'harry': [2, 'smith']}
b = {'jasper': [1, 'jones'], 'harry': [1, 'smith']}
我希望使用b
更新dict a
,而如果有重复的密钥,我想将value[0]
和a
加在一起。< / p>
所以b
最终会像:
b
必须是更新,不应该每次都创建一个新的dict,例如:
b = {'jasper': [1, 'jones'], 'harry': [3, 'smith'], 'steve': [1, 'jones']}
答案 0 :(得分:1)
正如其他人所说,你使用的是糟糕的结构。也许这是一个更好的结构:
a = {'steve': {'jones': 1}, 'harry': {'smith': 2}}
b = {'jasper': {'jones': 1}, 'harry': {'smith': 1}}
这样你只需要检查密钥是否存在并最终增加值,否则你在dict中创建一个新密钥
答案 1 :(得分:1)
我建议使用collections.Counter
作为结构的值。这样可以轻松添加,并允许每个键具有多个值:
from collections import Counter
a = {'steve': Counter({'jones': 1}), 'harry': Counter({'smith': 2})}
b = {'jasper': Counter({'jones': 1}), 'harry': Counter({'smith': 1})}
我说这样做更容易进行添加,请查看:
for key, val in b.items():
try:
a[key] += val
except KeyError:
a[key] = val
print(a)
#{'harry': Counter({'smith': 3}),
# 'jasper': Counter({'jones': 1}),
# 'steve': Counter({'jones': 1})}
您甚至可以更进一步使用collections.defaultdict
a
,这会使迭代中的try
和except
过时:
from collections import defaultdict
a = defaultdict(Counter, {'steve': Counter({'jones': 1}), 'harry': Counter({'smith': 2})})
for key, val in b.items():
a[key] += val
print(a)
#defaultdict(collections.Counter,
# {'harry': Counter({'smith': 3}),
# 'jasper': Counter({'jones': 2}),
# 'steve': Counter({'jones': 1})})