[英]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}
迭代mylist
和d
的值,并将每次迭代中的值添加到对应键 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.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}
在此处阅读有关第二部分的更多信息。
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.