首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python中两个嵌套字典中相似键的和值

python中两个嵌套字典中相似键的和值
EN

Stack Overflow用户
提问于 2017-03-09 10:56:16
回答 2查看 1.4K关注 0票数 8

我有这样的嵌套字典:

代码语言:javascript
复制
data = {
    "2010":{
            'A':2,
            'B':3,
            'C':5,
            'D':-18,
        },
    "2011":{
            'A':1,
            'B':2,
            'C':3,
            'D':1,
        },
    "2012":{
            'A':1,
            'B':2,
            'C':4,
            'D':2
        }
    }

在我的例子中,从2010年到2012年,我每年都需要根据其相似的键对所有的值进行求和。所以我期望的结果应该是这样的:

代码语言:javascript
复制
data = {'A':4,'B':7, 'C':12, 'D':-15}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-09 11:00:54

尝尝这个,

代码语言:javascript
复制
reduce(lambda x, y: dict((k, v + y[k]) for k, v in x.iteritems()), data.values())

结果

代码语言:javascript
复制
{'A': 4, 'B': 7, 'C': 12, 'D': -15}
票数 2
EN

Stack Overflow用户

发布于 2017-03-09 10:58:16

您可以使用collections.Counter() (只适用于正值!):

代码语言:javascript
复制
In [17]: from collections import Counter
In [18]: sum((Counter(d) for d in data.values()), Counter())
Out[18]: Counter({'C': 12, 'B': 7, 'A': 4, 'D': 3})

请注意,基于python文档,Counter仅针对具有正值的用例设计:

多集方法仅针对具有正值的用例设计。输入可以是负的,也可以是零的,但是只创建了具有正值的输出。没有类型限制,但值类型需要支持加法、减法和比较。elements()方法需要整数计数。它忽略零和负计数。

因此,如果您想得到一个全面的结果,您可以手工进行求和。collections.defaultdict()是解决这个问题的好方法:

代码语言:javascript
复制
In [28]: from collections import defaultdict

In [29]: d = defaultdict(int)

In [30]: for sub in data.values():
   ....:     for i, j in sub.items():
   ....:         d[i] += j
   ....:         

In [31]: d
Out[31]: defaultdict(<class 'int'>, {'D': -15, 'A': 4, 'C': 12, 'B': 7})
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42693487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档