【问题标题】:Sum values in nested dictionary in python [duplicate]python中嵌套字典中的总和值[重复]
【发布时间】:2021-10-03 10:54:09
【问题描述】:

我有一个字典列表:

data = [
    {"2010" : {'A' : 2,'B' : 3,'C' : 5,}},    
    {"2011" : {'A' : 1,'B' : 2,}},
    {"2010" : {'A' : 1,'B' : 2,}}
]

我想对键相同的值求和。所以我预期的结果应该是这样的:

res =
    {"2010" : {'A' : 3, 'B' : 5, 'C' : 5},
     "2011" : {'A' : 1, 'B' : 2}}

我怎样才能轻松做到这一点?

【问题讨论】:

  • 你不能有一个重复相同键的字典
  • 键在 python dict 中总是唯一的。你的data 是不可能复制的,除非它是一个列表或一些可以保存重复值的数据结构。
  • 对不起,这是真的,我不准确。它是一个字典列表。
  • res 是一本字典

标签: python list dictionary nested


【解决方案1】:

所以你有一个字典列表作为输入,你想创建一个包含总和的输出字典:

from collections import defaultdict

data = [{'2010': {'A': 2, 'B': 3, 'C': 5}}, {'2011': {'A': 1, 'B': 2}}, {'2010': {'A': 1, 'B': 2}}]

def sum_values(data):
    out = {}
    for i in data:
        for k in i.keys():
            if k not in out:
                out[k] = defaultdict(int)
            for k1,v1 in i[k].items():
                out[k][k1] += v1
    return out

sum_values(data)
{'2010': defaultdict(<class 'int'>, {'A': 3, 'B': 5, 'C': 5}), '2011': defaultdict(<class 'int'>, {'A': 1, 'B': 2})}

【讨论】:

    【解决方案2】:

    试试这个

    data = [
        { "2010":{'A':2,'B':3,'C':5,}},    
        { "2011":{'A':1,'B':2,}},
        {"2010":{'A':1,'B':2,}}
    ]
    
    res = {}
    
    for d in data:
        # print(d.items())
        items = list(d.items())[0]  # convert to list because dict items isn't subscriptable
        year, value = items
        if year not in res:
            res[year] = value
    

    res 等于

    {
        '2010': {'A': 2, 'B': 3, 'C': 5},
        '2011': {'A': 1, 'B': 2}
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用.get(),如下所示。

      试试这个:

      data = [
          {"2010" : {'A' : 2,'B' : 3,'C' : 5,}},    
          {"2011" : {'A' : 1,'B' : 2,}},
          {"2010" : {'A' : 1,'B' : 2,}}
      ]
      
      dct = {}
      for d in data:
          for k,v in d.items():
              dct[k] = dct.get(k,{})
              for k2,v2 in v.items():
                  dct[k][k2] = dct[k].get(k2,0) + v2
                  
      print(dct)
      

      输出:

      {'2010': {'A': 3, 'B': 5, 'C': 5}, '2011': {'A': 1, 'B': 2}}
      

      【讨论】:

      • @Bob 欢迎,是的,您可以,已编辑答案
      猜你喜欢
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多