我有这个词典列表:
[{'Eva': [4, 8, 2]}, {'Ana': [57, 45, 57]}, {'Ada': [12]}]
我需要得到每个键值的平均值,以便输出为:
[{'Eva': [5], {'Ana' : [53]}, {'Ada':[12]}]
必须通过添加0.5并仅取整数部分来向上或向下舍入平均值。例如,如果平均值为4.3,则加0.5等于4.8,因此输出为4.如果平均值为4.6,则加0.5等于5.1,因此输出为5.
我知道如何使用iteritems()
来迭代字典,但由于这是一个列表,我不知道如何达到每个值。
提前致谢。
答案 0 :(得分:4)
定义average
函数,然后使用嵌套的list
/ dict
理解来获取列表中每个字典的每个键的平均值。
>>> from __future__ import division
>>> lst = [{'Eva': [4, 8, 2]}, {'Ana': [57, 45, 57]}, {'Ada': [12]}]
>>> avg = lambda x: int(round(sum(x) / len(x)))
>>> [{k: avg(v) for k, v in d.items()} for d in lst]
[{'Eva': 5}, {'Ana': 53}, {'Ada': 12}]
如果您希望将平均值包含在列表中,只需使用[avg(v)]
:
>>> [{k: [avg(v)] for k, v in d.items()} for d in lst]
[{'Eva': [5]}, {'Ana': [53]}, {'Ada': [12]}]
答案 1 :(得分:4)
您可以使用zip
和numpy
函数mean
和round
执行此任务:
In [8]: import numpy as np
In [9]: [dict(zip(d.keys(), [int(np.round(np.mean(d.values())))])) for d in L]
#Out[9]: [{'Eva': 5}, {'Ana': 53}, {'Ada': 12}]
版本与"较少"括号:
[dict(zip(d.keys(), [np.array(d.values()).mean().round().astype(int)])) for d in L]
答案 2 :(得分:1)
这是一个“易于阅读和理解”的解决方案。我想从你的问题中你对python没有太多的信心所以,我会保持它非常基本。
myList = [{'Eva': [4, 8, 2]}, {'Ana': [57, 45, 57]}, {'Ada': [12]}]
result = []
for item in myList:
for k,v in item.items(): #use iteritems() if Python2
average = round(sum(v)/len(v)) #round to the closest integer
result.append({k:average})
>>>print(result)
[{'Eva': 5}, {'Ana': 53}, {'Ada': 12}]
答案 3 :(得分:0)
你可以这样做:
data = [{'Eva': [4, 8, 2]}, {'Ana': [57, 45, 57]}, {'Ada': [12]}]
outdata = []
for item in data:
tmp = {}
for key, val in item.iteritems():
avg = reduce(lambda x, y: x + y, val) / len(val)
tmp[key] = [avg]
outdata.append(tmp)
在你有多个键的字典的情况下也可以使用(尽管如果这种情况永远不会发生,那么额外的变量可能会浪费)。
答案 4 :(得分:0)
Oneliner:
[{el.keys()[0]: [int( round(1.0 * sum(el.values()[0]) / len(el.values()[0]) ))]} for el in li]
[{'Eva': [5]}, {'Ana': [53]}, {'Ada': [12]}]