我有两个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}