【问题标题】:Add up values of same key in nested dictionary where keys are elements of a list在嵌套字典中添加相同键的值,其中键是列表的元素
【发布时间】:2022-01-19 23:25:52
【问题描述】:
mylist = ['01', '02']
d = {'01': {'age':19, 'answ1':3, 'answ2':7, 'answ3':2},
     '02': {'age':52, 'answ1':8, 'answ2':1, 'answ3':10},
     '03': {'age':32, 'answ1':28, 'answ2':3, 'answ3':15}}

它应该打印两个dicts 的总和,这两个'01' 和'02' 具有键。

输出应该是{'age':71, 'answ1':11, 'answ2':8, 'answ3':12}。

我知道可以通过嵌套的for 循环来完成,但我做不到。

【问题讨论】:

  • 你做了什么尝试?与您的想象相反,Stackoverflow 不是免费的定制软件设计和编码服务。

标签: python list dictionary for-loop nested


【解决方案1】:

创建并清空字典,初始化为零。 Python 可以去迭代列表的项目,所以它变成了一个索引问题。

mylist = ['01', '02']
d = {'01': {'age':19, 'answ1':3, 'answ2':7, 'answ3':2}, '02': {'age':52, 'answ1':8, 'answ2':1, 'answ3':10}, '03': {'age':32, 'answ1':28, 'answ2':3, 'answ3':15}}
sum_dic ={'age':0, 'answ1':0, 'answ2':0, 'answ3':0}
for item in mylist:
    sum_dic['age'] += d[item]['age']
    sum_dic['answ1'] += d[item]['answ1']
    sum_dic['answ2'] += d[item]['answ2']
    sum_dic['answ3'] += d[item]['answ3']
print(sum_dic)

【讨论】:

    【解决方案2】:
    >>> from collections import defaultdict
    >>> totals = defaultdict(int)
    >>> for x in (d[k] for k in mylist):
    ...     for k, v in x.items():
    ...         totals[k] += v
    ... 
    >>> dict(totals)
    {'age': 71, 'answ1': 11, 'answ2': 8, 'answ3': 12}
    

    【讨论】:

      【解决方案3】:

      迭代mylist和d的值,并将每次迭代中的值添加到out中对应键的值中。

      out = {}
      for key in mylist:
          for k,v in d[key].items():
              out[k] = out.get(k, 0) + v
      

      输出:

      {'age': 71, 'answ1': 11, 'answ2': 8, 'answ3': 12}
      

      【讨论】:

        【解决方案4】:

        在functools.reduce、collections.Counter 和operator.(add, itemgetter) 的帮助下,这是在一行代码中执行此操作的另一种方法-

        from collections import Counter
        from functools import reduce
        from operator import add, itemgetter
        
        dict(reduce(add, map(Counter, itemgetter(*mylist)(d))))
        
        #OR 
        
        dict(reduce(add, (Counter(d[i]) for i in mylist)))
        
        {'age': 71, 'answ1': 11, 'answ2': 8, 'answ3': 12}
        

        说明

        阅读更多关于第二部分的信息here。

        • itemgetter 使用与mylist 匹配的键获取d 中的值。随意将其更改为生成器。

        • 一个简单的例子展示了上面代码的本质。您可以添加两个带有+ 或operator.add 的计数器字典,如下所示 -

        Counter({'a':1,'b':3}) + Counter({'a':4,'b':1})
        
        Counter({'a': 5, 'b': 4})
        

        【讨论】:

          【解决方案5】:

          字典理解怎么样:

          mylist = ['01', '02']
          d = {'01': {'age':19, 'answ1':3, 'answ2':7, 'answ3':2},
               '02': {'age':52, 'answ1':8, 'answ2':1, 'answ3':10},
               '03': {'age':32, 'answ1':28, 'answ2':3, 'answ3':15}}
          
          r = { k:sum(d[dk][k] for dk in mylist) for k in d[mylist[0]] }
          
          print(r)
          {'age': 71, 'answ1': 11, 'answ2': 8, 'answ3': 12} 
          

          您也可以在现有字典的更新调用中使用迭代器:

          r = dict()
          r.update( (k,r.get(k,0)+n) for dk in mylist for k,n in d[dk].items())
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-08-21
            • 2022-01-04
            • 2016-04-14
            • 1970-01-01
            • 1970-01-01
            • 2022-01-21
            • 2019-12-17
            相关资源
            最近更新 更多