1

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

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

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

[2, [], 1]

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

谢谢。

4

3 回答 3

11

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

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似乎更合适。

于 2012-05-24T14:34:23.700 回答
5

假设您已经导入了numpynumbers. 没有数字元素的列表显示为nan结果列表。

[numpy.mean([x for x in sublist if isinstance(x, numbers.Number)]) for sublist in mainlist]
于 2012-05-24T14:44:22.170 回答
1

鉴于:

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]]
于 2012-05-24T14:53:37.647 回答