使用自定义更新合并两个dict



我有两个Python字典,我想将它们合并(并集(在一起,但要使用自定义更新函数,以防两个字典中存在相同的键。例如:

>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 10, 'c': 11}
>>> z = {'a': 3, 'd': 5}
>>> merge(x,y,z)  # add values together if key exists in both
{'a': 4, 'b': 12, 'c': 11, 'd': 5}

最简单的方法是什么?

编辑:我正在寻找一种解决方案,可以将任意数量的dict合并,并在同一个键位于多个dict中时执行任意操作(不一定要添加(。

使用collections.Counter。它会帮助你的。

from collections import Counter
A = Counter({'a': 1, 'b': 2})
B = Counter({'b': 10, 'c': 11})
print(dict(A+B))

输出

{'a': 1, 'b': 12, 'c': 11}

获取两个字典中所有键的并集,只需使用默认值为0的dict.get()将两个字典的值相加,即可使用字典理解。

def merge(d1, d2):
keys = set(d1.keys()).union(d2.keys())
return {k: d1.get(k,0)+d2.get(k,0) for k in keys}

输出:

>>> merge(x, y)
{'c': 11, 'a': 1, 'b': 12}

速度比较(快4倍(

using merge (custom function): 
2.99 µs ± 574 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
using Counter: 
14.2 µs ± 709 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

更新问题后:

如果你想对任意数量的dictionaryes进行修改,你可以使用*args对函数进行一点修改:

def merge(*args):
keys = set()
for arg in args:
keys = keys.union(arg.keys())
return {k: sum(arg.get(k,0) for arg in args) for k in keys}

输出:

>>> merge(x, y, z)
{'a': 4, 'd': 5, 'c': 11, 'b': 12}

最新更新