字典列表中键值的平均值



我有以下字典列表:

[{'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()迭代字典,但由于这是一个列表,我不知道如何达到每个值。

提前谢谢。

您可以将zipnumpy函数meanround用于此任务:

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)

这也适用于具有多个键的字典的情况(尽管如果永远不会发生这种情况,那么额外的变量可能是浪费的)。

最新更新