【问题标题】:compute average over a list in python, excluding literals计算python中列表的平均值,不包括文字
【发布时间】:2012-05-31 03:49:14
【问题描述】:

在 Python 中,我有一个列表,如下所示:

[[1,2,3, 'L'], ['L'], [1]]

我想为每个子列表计算所有数字元素的平均值。因此应排除值“L”。上面例子的结果应该是:

[2, [], 1]

有没有什么快速的方法可以在一行中做到这一点?

谢谢。

【问题讨论】:

  • 您是特别想要一行,还是尽可能短?我很确定您不能在一行中做到这一点,因为您至少需要完成 2 或 3 个不同的高级操作。
  • 越短越好!我只是想有一种更聪明的方法来做这件事,而不是遍历每个子列表、检查它是否不是“L”、递增计数器和总和等。
  • 为什么结果是[2, [], 1]而不是[2, 0, 1]
  • @Zoozy:空列表的平均值是未定义的,而不是 0。我可能会使用 Nonefloat("nan") 作为未定义的值。
  • @jamylak,好吧,当然,有几个嵌套列表推导式,我想......但是男人会很难看。

标签: python list average literals mean


【解决方案1】:

为了得到您要求的确切结果,我会这样做:

from __future__ import division
import numbers
def average_over_numeric_values(a):
    filtered = [x for x in a if isinstance(x, numbers.Number)]
    if filtered:
        return sum(filtered) / len(filtered)
    return []
print(map(average_over_numeric_values, list_of_lists))

这并不完全是单行的,而是一种可读性很强的方式。

就个人而言,如果列表中没有空值,我不会使用[]——None 似乎更合适。

【讨论】:

  • if len(filtered)if filtered的幕后功能不一样,哪个更简洁?
  • return np.mean(filtered) if filtered else []
  • sum([]) == 0 所以0 是更一致的选择。
  • @wim:使用 NumPy,我只需执行 numpy.mean(filtered),它会返回 nan 以获取空输入。
  • @J.F.Sebastian:平均值为sum([])/len([]),这是未定义的,不是零。
【解决方案2】:

假设您已经导入了numpynumbers,这是一个非常不可读的单行代码。没有数字元素的列表在结果列表中显示为 nan

[numpy.mean([x for x in sublist if isinstance(x, numbers.Number)]) for sublist in mainlist]

【讨论】:

    【解决方案3】:

    给定:

    x = [[1,2,3, 'L'], ['L'], [1]]
    

    如果您必须使用单线:

    [sum(w)/float(len(w)) if w else w for w in [[z for z in y if isinstance(z, numbers.Number)] for y in x]]
    

    【讨论】:

      猜你喜欢
      • 2019-04-03
      • 1970-01-01
      • 2021-11-22
      • 2016-10-02
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多