辞書のマージ(同一キーの値は加算)

辞書のマージで、同一のキーが存在してたら、値を加算するような事がしたかった。

{'a': 1, 'c': 3, 'b': 2} + {'a': 1, 'c': 3, 'b': 2}  #=> {'a': 2, 'c': 6, 'b': 4}

単にマージするだけだったら、dict.updateで出来るけど、同一キーの場合に値を加算するってのはどうしたらいいか良くわからんかった。

前提として、辞書の値は、数値だった。

こうやった

たしかスタックなんちゃらフローで探して、割とベタにこんな風にやった。URLは忘れてもうた。

def merge_dict(d1, d2, func=lambda x, y: y):
    d1 = d1.copy()
    d2 = d2.copy()
    for k, v in d2.iteritems():
        d1[k] = func(d1[k], v) if k in d1 else v
    d2.update(d1)
    return d2

d1 = {'a': 1, 'c': 3, 'b': 2}
merge_dict(d1, d1)  #=> {'a': 1, 'c': 3, 'b': 2}   通常のupdateと結果は一緒
merge_dict(d1, d1, lambda x, y: x + y) #=> {'a': 2, 'c': 6, 'b': 4} 

余談

  • なんかもっと簡単にやる方法あったらいいなぁ
  • なんでcopyでやったのかは忘れた。

以上おわり