繁体   English   中英

在嵌套字典中添加相同键的值,其中键是列表的元素

[英]Add up values of same key in nested dictionary where keys are elements of a list

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}}

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

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

我知道它可以通过嵌套for循环来完成,但我不能。

创建并清空字典,初始化为零。 Python 可以 go 迭代列表的项目,因此它成为索引问题。

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)
>>> 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}

迭代mylistd的值,并将每次迭代中的值添加到对应键 in out处的值。

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

Output:

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

这是在functools.reducecollections.Counteroperator.(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}

解释

在此处阅读有关第二部分的更多信息。

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

  • 一个简单的例子展示了上面代码的本质。 您可以使用+operator.add添加两个 Counter 字典,如下所示 -

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

字典理解怎么样:

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())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM