我有以下字典列表:
[{'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()
迭代字典,但由于这是一个列表,我不知道如何达到每个值。
提前谢谢。
您可以将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]
定义一个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]}]
这是一个"易于阅读和理解"的解决方案。从你的问题中,我猜你对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}]
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]}]
你可以做:
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)
这也适用于具有多个键的字典的情况(尽管如果永远不会发生这种情况,那么额外的变量可能是浪费的)。