在Python中,我有一个列表如下:
[[1,2,3, 'L'], ['L'], [1]]
我想为每个子列表计算所有数字元素的平均值。因此应排除值“L”。以上示例的结果应为:
[2, [], 1]
有没有快速的方法在一行中做到这一点?
感谢。
答案 0 :(得分: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
似乎更合适。
答案 1 :(得分:5)
假设您已导入numpy
和numbers
,这是一个非常难以理解的单行内容。没有数字元素的列表在结果列表中显示为nan
。
[numpy.mean([x for x in sublist if isinstance(x, numbers.Number)]) for sublist in mainlist]
答案 2 :(得分: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]]