次の行に沿ってネストされた辞書があります。
{'apple': {'a': 1, 'b': 4, 'c': 2},
'orange': {'a': 4, 'c': 5},
'pear': {'a': 1, 'b': 2}}
私がやりたいことは、外側のキーを取り除き、内側のキーの値を合計して、次のような新しい辞書を作成することです。
{'a': 6, 'b': 6, 'c': 7}
次の行に沿ってネストされた辞書があります。
{'apple': {'a': 1, 'b': 4, 'c': 2},
'orange': {'a': 4, 'c': 5},
'pear': {'a': 1, 'b': 2}}
私がやりたいことは、外側のキーを取り除き、内側のキーの値を合計して、次のような新しい辞書を作成することです。
{'a': 6, 'b': 6, 'c': 7}
Counterクラスを使用できます。
>>> from collections import Counter
>>> d = {'apple': {'a': 1, 'b': 4, 'c': 2}, 'orange': {'a': 4, 'c': 5}, 'pear': {'a': 1, 'b': 2}}
>>> sum(map(Counter, d.values()), Counter())
Counter({'c': 7, 'a': 6, 'b': 6})
from collections import defaultdict
d = defaultdict(int)
for dct in yourdict.values():
for k,v in dct.items():
d[k] += v
この回答の主な利点は、それが python2.5 まで機能することです。python2.7+ については、@DSM および @BigYellowCactus によって投稿されたソリューションを参照してください。
これは別のcollections.Counter
解決策です。他の解決策のようなワンライナーではありませんが、よりクリーンだと思います。
from collections import Counter
d = {'apple': {'a': 1, 'b': 4, 'c': 2}, 'orange': {'a': 4, 'c': 5}, 'pear': {'a': 1, 'b': 2}}
counts = Counter()
for v in d.values():
counts.update(v)
Counterオブジェクトは、次のようなことを非常に簡単にするように設計されています。
>>> from collections import Counter
>>> d = {'apple': {'a': 1, 'b': 4, 'c': 2}, 'orange': {'a': 4, 'c': 5}, 'pear': {'a': 1, 'b': 2}}
>>> sum((Counter(v) for v in d.itervalues()), Counter())
Counter({'c': 7, 'a': 6, 'b': 6})