问题描述
我知道已经有类似的问题了 (List comprehension that ignores NaN) 但解决方案不适合我的情况。
我有一个元组列表。我正在使用列表理解从这个元组列表中生成一个子元组列表。根据我读入的数据文件,有时我有 NaN (np.nan
) 值。在这些情况下,我的列表理解会返回 nans (nan,nan)
的元组,但我希望它没有。
以下是我尝试过的示例。它没有给我我想要的输出,但也没有给出错误:
list_values =
[('A',1.,2.,1),('B',3.,4.,('C',5.,6.,('D',nan,('E',('F',1)])
我认为这会奏效,但没有:
pairs = [tuple((x[1] + x[3],x[2] + x[3])) for x in list_values if x[1] is not np.nan]
它返回这个:
[(2.0,3.0),(4.0,5.0),(6.0,7.0),(nan,nan),nan)]
而我想:
[(2.0,7.0)]
我不知道为什么我的 if 条件什么都不做。感谢您的任何见解,谢谢!
解决方法
is not np.nan
不是您进行 NaN 检查的方式。这是对特定对象 np.nan
的身份检查,大多数 NaN 不会是该特定对象。
math.isnan
是 NaN 检查,您可以使用 genexp 将该检查应用于 x
的元素。 (此外,您不需要对元组调用 tuple
。)
pairs = [(x[1] + x[3],x[2] + x[3]) for x in list_values
if all(not math.isnan(elem) for elem in x[1:])]