【问题标题】:Return first non NaN value in python list返回python列表中的第一个非NaN值
【发布时间】: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


    【解决方案1】:

    您可以使用nextgenerator expressionmath.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) 也可以工作,而且它可能会更快一些,因为它避免了对函数的大量查找(尽管非常不可读)。
    【解决方案2】:

    如果你做的很多,把它放到一个函数中让它可读和简单:

    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
    

    【讨论】:

      【解决方案3】:

      如果你使用 NumPy 会很容易:

      array[numpy.isfinite(array)][0]
      

      ...返回 NumPy 数组“array”中的第一个有限(非 NaN 和非 inf)值。

      【讨论】:

      • 非常干净,可能比手动循环更快。
      【解决方案4】:

      下面一行 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
      

      【讨论】:

        猜你喜欢
        • 2019-12-07
        • 2018-04-06
        • 1970-01-01
        • 2017-09-02
        • 2017-06-24
        • 1970-01-01
        • 2017-02-21
        • 1970-01-01
        • 2022-01-10
        相关资源
        最近更新 更多