【问题标题】:Average of key values in a list of dictionaries字典列表中键值的平均值
【发布时间】:2016-04-29 13:03:33
【问题描述】:

我有这个字典列表:

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

提前致谢。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 为什么你有一个字典列表,每个字典都有一个键,而不是一个字典?
  • 我尝试了一个 for 循环,但它只给了我 'Eva' 字典
  • 您不一定需要明确地遍历列表。您只需使用sum,然后除以列表长度。
  • 我必须将最终的字典列表转换为 .csv 文件,第一列是主人的姓名,第二列是宠物的平均年龄,这就是为什么我在一个列表中有几个字典的原因

标签: python list python-2.7 dictionary


【解决方案1】:

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

带有“less”括号的版本:

[dict(zip(d.keys(), [np.array(d.values()).mean().round().astype(int)])) for d in L]

【讨论】:

  • 预期的输出是dicts。
  • 字典列表!并且平均值应该是一个整数
  • 很抱歉快速进行了相应的修改
  • ())))])) 哇,这是自 Lisp 以来我见过的最多的括号! ;-)
【解决方案2】:

定义一个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]}]

【讨论】:

  • 我要发布的内容相同,但 OP 想要列表中的平均值
  • 是的,因为我将使用该列表将其转换为 .csv 文件
  • 其实没关系,平均值不需要在列表中
  • 所有 OP 需要做的就是将 avg(v) 包裹在 [] 中,以便在需要时获取列表。
  • int(round(sum(x) / len(x))) 不是多余的吗?我认为round(sum(x) / len(x)) 产生相同的结果。
【解决方案3】:

这是一个“易于阅读和理解”的解决方案。我猜你的问题是你对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}]

【讨论】:

  • 我需要输出一个字典列表,所以函数需要返回那个列表
  • 我已经做了相应的修改。现在结果是一个字典列表
【解决方案4】:

你可以这样做:

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)

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多