>>> from collections import defaultdict
>>> d=defaultdict(lambda:(0,0))
>>> for D in all_dictionaries:
... weight = D['weight']
... for k,v in D['data'].items():
... d[k]=d[k][0]+weight*v,d[k][1]+weight
...
>>> dict((k,v[0]/v[1]) for k,v in d.items())
{'apples': 5, 'oranges': 7, 'bananas': 3}
Если вам нужен результат с плавающей точкой
>>> dict((k,1.*v[0]/v[1]) for k,v in d.items())
{'apples': 5.0, 'oranges': 7.0, 'bananas': 3.0}
Примечания о defaultdict
Часто вы видите defaultdict(int)
или defaultdict(list)
может быть, даже defaultdict(set)
.Аргумент defaultdict должен вызываться без параметров.Результат вызова этого параметра используется всякий раз, когда обнаруживается, что ключ отсутствует.то есть - вызов этого возвращает значение по умолчанию для словаря
, например
>>> d=defaultdict(int)
>>> d[1]
0
>>> d['foo']
0
Это часто используется для подсчета вещей, потому что int()
возвращает 0. Есливы хотите, чтобы значение по умолчанию было 1 вместо 0, это более сложно, потому что вы не можете передать параметр в int, но все, что вам нужно, это вызываемый элемент, который возвращает 1. Это можно сделать без особых хлопот, используя лямбда функция.
>>> d=defaultdict(lambda:1)
>>> d[1]
1
>>> d['foo']
1
В этом ответе я хочу отслеживать взвешенную сумму и общую массу.Я могу сделать это, используя 2-кортеж в качестве значения по умолчанию.
>>> d=defaultdict(lambda:(0,0))
>>> d[1]
(0, 0)
>>> d['foo']
(0, 0)