我喜欢这样:
dict = [{'a':2, 'b':3}, {'b':4}, {'a':1, 'c':5}]
我需要获得所有不同键的平均值。结果应如下所示:
avg = [{'a':1.5, 'b':3.5, 'c':5}]
我可以得到所有键的摘要,但我没有意识到如何计算相同的键以获得平均数。
答案 0 :(得分:4)
使用pandas:
可以轻松完成此操作>>> import pandas
>>> df = pandas.DataFrame([{'a':2, 'b':3}, {'b':4}, {'a':1, 'c':5}])
>>> df.mean()
a 1.5
b 3.5
c 5.0
dtype: float64
如果您需要字典作为结果:
>>> dict(df.mean())
{'a': 1.5, 'b': 3.5, 'c': 5.0}
答案 1 :(得分:2)
您可以创建一个中间字典,将所有遇到的值收集为列表:
dct = [{'a':2, 'b':3}, {'b':4}, {'a':1, 'c':5}]
from collections import defaultdict
intermediate = defaultdict(list)
for subdict in dct:
for key, value in subdict.items():
intermediate[key].append(value)
# intermediate is now: defaultdict(list, {'a': [2, 1], 'b': [3, 4], 'c': [5]})
最后通过将每个列表的总和除以每个列表的长度来计算平均值:
for key, value in intermediate.items():
print(key, sum(value)/len(value))
打印:
b 3.5
c 5.0
a 1.5
答案 2 :(得分:1)
您可以将for循环与计数器一起使用,然后将每个计数器的总和除以计数器。
同样很奇怪你将数组/列表称为dict ...
我建议这样的事情:
创建一个新的dict: letter_count = {}
-For循环当前的dicts
- 如果字母不存在,请将字母添加到字母计数
- 如果确实存在,请使用项目的值(+ =数字)更新值,并将计数器更新一次
- 完成for循环后,将每个值除以计数器
- 返回新的字母letter_count
答案 3 :(得分:1)
我想过使用PyFunctional
添加一个独特的答案from functional import seq
l = [{'a':2, 'b':3}, {'b':4}, {'a':1, 'c':5}]
a = (seq(l)
# convert dictionary to list
.map(lambda d: seq(d).map(lambda k: (k, d[k])))
.flatten()
# append 1 for counter
.map(lambda (k, v): (k, (v, 1)))
# sum of values, and counts
.reduce_by_key(lambda a, b: (a[0]+b[0], a[1]+b[1]))
# average
.map(lambda (k, (v, c)): (k, float(v)/c))
# convert to dict
.to_dict()
)
print(a)
输出
{'a': 1.5, 'c': 5.0, 'b': 3.5}