これを実現するには、ディクショナリ ビューを使用します。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}