词典列表

时间:2016-04-29 13:03:34

标签: python list python-2.7 dictionary

我有这个词典列表:

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

提前致谢。

5 个答案:

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

您可以使用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]

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