【发布时间】:2014-04-03 11:33:52
【问题描述】:
从该列表返回第一个非 nan 值的最佳方法是什么?
testList = [nan, nan, 5.5, 5.0, 5.0, 5.5, 6.0, 6.5]
编辑:
nan 是一个浮点数
【问题讨论】:
标签: python list python-2.7
从该列表返回第一个非 nan 值的最佳方法是什么?
testList = [nan, nan, 5.5, 5.0, 5.0, 5.5, 6.0, 6.5]
编辑:
nan 是一个浮点数
【问题讨论】:
标签: python list python-2.7
您可以使用next、generator expression 和math.isnan:
>>> from math import isnan
>>> testList = [float('nan'), float('nan'), 5.5, 5.0, 5.0, 5.5, 6.0, 6.5]
>>> next(x for x in testList if not isnan(x))
5.5
>>>
【讨论】:
next(x for x in testList if x == x) 也可以工作,而且它可能会更快一些,因为它避免了对函数的大量查找(尽管非常不可读)。
如果你做的很多,把它放到一个函数中让它可读和简单:
import math
t = [float('nan'), float('nan'), 5.5, 5.0, 5.0, 5.5, 6.0, 6.5]
def firstNonNan(listfloats):
for item in listfloats:
if math.isnan(item) == False:
return item
firstNonNan(t)
5.5
【讨论】:
如果你使用 NumPy 会很容易:
array[numpy.isfinite(array)][0]
...返回 NumPy 数组“array”中的第一个有限(非 NaN 和非 inf)值。
【讨论】:
下面一行 lambda:
from math import isnan
lst = [float('nan'), float('nan'), 5.5, 5.0, 5.0, 5.5, 6.0, 6.5]
lst
[nan, nan, 5.5, 5.0, 5.0, 5.5, 6.0, 6.5]
第一个非 nan 值
lst[lst.index(next(filter(lambda x: not isnan(x), lst)))]
5.5
第一个非 nan 值的索引
lst.index(next(filter(lambda x: not isnan(x), lst)))
2
【讨论】: