带有自定义合并功能的Python合并字典
问题内容:
我想合并两个字典A和B,使结果包含:
- 来自A的所有对,其中密钥是A唯一的
- 来自B的所有对,其中密钥是B唯一的
- f(valueA,valueB)在A和B中都存在相同的键
例如:
def f(x, y):
return x * y
A = {1:1, 2:3}
B = {7:3, 2:2}
C = merge(A, B)
输出:
{1:1, 7:3, 2:6}
感觉应该有一个不错的选择。
问题答案:
使用字典视图来实现这一点;该dict.viewkeys()
结果就像一组,让你做的十字路口和对称的区别:
def merge(A, B, f):
# Start with symmetric difference; keys either in A or B, but not both
merged = {k: A.get(k, B.get(k)) for k in A.viewkeys() ^ B.viewkeys()}
# Update with `f()` applied to the intersection
merged.update({k: f(A[k], B[k]) for k in A.viewkeys() & B.viewkeys()})
return merged
在Python 3中,该.viewkeys()
方法已重命名为.keys()
,取代了旧.keys()
功能(在Python 2中会重现列表)。
上面的merge()
方法是适用于任何给定的通用解决方案f()
。
演示:
>>> def f(x, y):
... return x * y
...
>>> A = {1:1, 2:3}
>>> B = {7:3, 2:2}
>>> merge(A, B, f)
{1: 1, 2: 6, 7: 3}
>>> merge(A, B, lambda a, b: '{} merged with {}'.format(a, b))
{1: 1, 2: '3 merged with 2', 7: 3}