4

次の行に沿ってネストされた辞書があります。

{'apple':  {'a': 1, 'b': 4, 'c': 2},
 'orange': {'a': 4, 'c': 5},
 'pear':   {'a': 1, 'b': 2}}

私がやりたいことは、外側のキーを取り除き、内側のキーの値を合計して、次のような新しい辞書を作成することです。

{'a': 6, 'b': 6, 'c': 7}
4

4 に答える 4

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})
于 2012-08-22T20:36:07.900 に答える
3
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 によって投稿されたソリューションを参照してください。

于 2012-08-22T20:34:48.880 に答える
3

これは別の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)
于 2012-08-22T20:43:26.673 に答える
2

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})
于 2012-08-22T20:35:25.020 に答える