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}}
它應該列印dict具有鍵'01'和的兩個s的總和'02'。
輸出應該是{'age':71, 'answ1':11, 'answ2':8, 'answ3':12}.
我知道它可以通過嵌套for回圈來完成,但我不能。
uj5u.com熱心網友回復:
創建并清空字典,初始化為零。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)
uj5u.com熱心網友回復:
>>> 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}
uj5u.com熱心網友回復:
迭代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}
uj5u.com熱心網友回復:
這是在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
d使用與 匹配的鍵獲取值mylist。隨意將其更改為生成器。一個簡單的例子展示了上述代碼的本質。您可以使用
或添加兩個 Counter 詞典,operator.add如下所示 -
Counter({'a':1,'b':3}) Counter({'a':4,'b':1})
Counter({'a': 5, 'b': 4})
uj5u.com熱心網友回復:
字典理解如何:
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())
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/386101.html
