2017-11-03 22 views
4

辞書のすべての辞書をマージし、メイン辞書のキーを無視して他の辞書の値を値で合計したいとします。 」(以下作品Pythonは辞書の辞書を値を合計して1つの辞書に統合します

def merge_dicts(large_dictionary): 
    result = {} 
    for name, dictionary in large_dictionary.items(): 
     for key, value in dictionary.items(): 
      if key not in result: 
       result[key] = value 
      else: 
       result[key] += value 
    return result 

を、私はそれがこのような良い方法だとは思わない:

入力:

{'first':{'a': 5}, 'second':{'a': 10}, 'third':{'b': 5, 'c': 1}} 

出力:

{'a': 15, 'b': 5, 'c': 1} 

は私がやりましたピソニック ")。

ところで、私は私が書いたタイトルが好きではありません。もし誰かがより良い言葉遣いを考えると編集してください。

+2

唯一の悪い点は、 'large_dictionary.items()'の代わりに 'large_dictionary.values()'の上に起こっています。 –

答えて

6

あなたはdictのサブクラスですカウンター、合計することができます:

>>> from collections import Counter 
>>> sum(map(Counter, d.values()), Counter()) 
Counter({'a': 15, 'b': 5, 'c': 1}) 
0

ほぼ同様に、それはわずかだと私はそれが少し良く好きです。あなたが

def merge_dicts(large_dictionary): 
    result = {} 
    for d in large_dictionary.values(): 
     for key, value in d.items(): 
      result[key] = result.get(key, 0) + value 
    return result 
2

この動作します

from collections import defaultdict 
values = defaultdict(int) 
def combine(d, values): 
    for k, v in d.items(): 
     values[k] += v 

for v in a.values(): 
    combine(v, values) 

print(dict(values)) 
+0

defaultdictにリストを入れていないので、defaultdict(lambda:0)、defaultdict(int)、defaultdict(lambda:0)の結果を同じにしました。しかし、intはより多くのpythonicになります、私はまた考えました。 – daemon24

+0

@wim Oh。うーん。私はいつも同じリストを返すと思った。しかし、それはしません。私はもっ​​と時間があるとき、これを考えなければならない。訂正してくれてありがとう。 –

+0

@wim Yeah ok私はばかだ... def f():return [] 'は常に同じものを返すとは期待していなかった。 'defaultdict(lambda:[])'の何かが何らかの形で私を捨てました。私はそれがパラメータのデフォルト表記法に似ているように思うので、推測します。 –