我有1000多个默认词典的字典,我想迭代每个默认字典,在键上加总,然后除以计数得到每个键的平均值。
每个默认字典都有相同的键,即
{'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0}
{'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0}
我希望以下内容成为我的输出
{'A': 1.0, 'B': 1.1, 'C': 2.0, 'D': 1.0, 'E': 2.0}
如何迭代添加默认值,然后将它们分开,在DataFrame中进行一行操作?或者有更好的方法来做这件事吗?
谢谢
答案 0 :(得分:5)
如何使用sum
字典理解:
d1 = {'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0}
d2 = {'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0}
dicts = {"d1": d1, "d2": d2}
n = len(dicts)
res = {k: sum(d[k] for d in dicts.values()) / n for k in d1}
# {'A': 1.0, 'B': 1.1, 'C': 2.0, 'D': 1.0, 'E': 2.0}
注意:假设您在问题中写道,所有的词组都有相同的键,或defaultdicts
,因此缺少的键不会导致错误。
答案 1 :(得分:4)
您可以使用collections.Counter
:
summed_dict = collections.Counter()
for d in partial_dicts:
summed_dict.update(d)
# Use .viewitems or .iteritems instead of .items on Py2
average_dict = {k: v / len(partial_dicts) for k, v in summed_dict.items()}
答案 2 :(得分:4)
您可以使用pandas.Series
执行两个字典值的平均,然后将系列转换回字典:
SecRuleUpdateTargetById 981203 !ARGS:'gclid'
答案 3 :(得分:1)
关于你的数据作为dicts的词典,那么我就是这样做的(非常实用的方法):
d = {1: {'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0},
2: {'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0}}
import functools
def add_dicts(d1, d2):
return {k:d1[k]+d2[k] for k in d1}
dsum = functools.reduce(add_dicts, d.values())
N = len(d.keys())
davg = {k:v/N for k,v in dsum.items()}
print(davg)
输出:
{'C': 2.0, 'E': 2.0, 'A': 1.0, 'B': 1.1, 'D': 1.0}
答案 4 :(得分:0)
迭代一个字典的键和值,并将值添加到另一个字典中相应键的值。
例如:
dict1 = {'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0}
dict2 = {'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0}
for key,value in dict1.iteritems():
dict2[key] = (value + dict2[key]) / 2
print dict2 # prints {'A': 1.0, 'B': 1.1, 'C': 2.0, 'D': 1.0, 'E': 2.0 }
为简单起见,您也可以创建一个新词典:
dict1 = {'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0}
dict2 = {'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0}
dictAns = dict()
for key,value in dict1.iteritems():
dictAns[key] = (value + dict2[key]) / 2
print dictAns # prints {'A': 1.0, 'B': 1.1, 'C': 2.0, 'D': 1.0, 'E': 2.0 }