更新dict但是如果重复键增加列表[0]值

时间:2017-03-02 21:08:37

标签: python dictionary

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

2 个答案:

答案 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,这会使迭代中的tryexcept过时:

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})})