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 回答