【问题标题】:List of lists that contain nan or inf in some of their items某些项目中包含 nan 或 inf 的列表列表
【发布时间】:2018-06-30 17:11:58
【问题描述】:

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

l = [[1,2,inf,inf,87],[3,4,3,5,3],[73,5,3,3,nan],[8,3,3,2,2],[3,3,2,2,inf]]

如何删除那些包含infnan 的列表?

谢谢。

【问题讨论】:

  • 有趣的是,链接的问题都没有帮助 OP。在关闭之前找到合适的骗子。
  • @MoinuddinQuadri:没有“在某种程度上对我来说是重复的”。请阅读官方duplicate policy。 “如果只是改变一些数值或一些变量名的问题,它们就是重复的。如果理解为什么这些问题完全相关需要详细解释,那么这些问题不是重复的,只是相关的。”

标签: python math nan


【解决方案1】:
[subl for subl in l if all(math.isfinite(x) for x in subl)]

(给定 Python >= 3.2;在早期的 Python 中,替换为 numpy.isfinite,或显式检查值)

【讨论】:

  • 感谢您的友好回复。您能否澄清您的观点“或明确检查价值”?特别是我只有“inf”和“nan”,而不像“math.inf”?
  • math.inf 是产生显示为inf 的值的代码。无论您如何获得值本身(math.inffloat('inf')...),它都是相同的值。通过“显式检查值”,我的意思是 @Dark 正在做的事情。
【解决方案2】:

您可以检查简单的条件,即

import math
l = [[1,2,math.inf,math.inf,87],[3,4,3,5,3],[73,5,3,3,math.nan],[8,3,3,2,2],[3,3,2,2,math.inf]]

[ i for i in l if (math.inf not in i) and (math.nan not in i) ]

[[3, 4, 3, 5, 3], [8, 3, 3, 2, 2]]

【讨论】:

  • 请注意(虽然 OP 不需要)此解决方案不会捕获 -inf。不过,这是一种完全有效的方法。
  • 感谢您的友好回复。我在尝试您的解决方案时得到以下信息:“AttributeError: 'module' object has no attribute 'inf'”
  • 我只是使用了 float('inf') 和 float('nan') 并认为它有效
  • 请注意,math.nan not in i 仅检查 that 特定的nan(我的意思是特定的 Python 对象,而不是特定的 nan 位模式)。这不是测试一般 nans 的安全方法。例如,如果您尝试math.nan not in [float('nan')],您将得到True 的意外答案。 nan 不是 Python 中的单例。
【解决方案3】:

inf 是 math.inf,nan 是 np.nan:

import math
lst = [[1,2,math.inf,math.inf,87],[3,4,3,5,3],[73,5,3,3,np.nan],[8,3,3,2,2],[3,3,2,2,math.inf]]
for l1 in lst:
    if math.inf not in l1 and np.nan not in l1:
        print(l1)

【讨论】:

    【解决方案4】:

    @Amadan 答案的变体:

    list(filter(lambda x: all(map(math.isfinite, x)), l))
    

    更通用的版本将使用numpy

    import numpy as np
    list(filter(lambda x: all(map(np.isfinite, x)), l))
    

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 2011-02-28
      • 2013-11-13
      • 1970-01-01
      • 2017-01-03
      相关资源
      最近更新 更多