在键上添加defaultdicts然后将它们分开

时间:2016-08-09 19:11:20

标签: python dictionary

我有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中进行一行操作?或者有更好的方法来做这件事吗?

谢谢

5 个答案:

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