跳过 NaN 值的列表理解

List comprehension that skips NaN values

我知道已经有类似的问题了 () 但解决方案不适合我的情况。

我有一个元组列表。我正在使用列表理解从这个元组列表中生成一个子元组列表。根据我正在读取的数据文件,有时我有 NaN (np.nan) 值。在这些情况下,我的列表理解返回 nans (nan, nan) 的元组,但我不希望它没有。

下面是我尝试过的示例。它没有给我想要的输出,但也没有给出错误:

   list_values = 
        [('A', 1., 2., 1),
         ('B', 3., 4., 1),
         ('C', 5., 6., 1),
       ('D', nan, nan, 1),
       ('E', nan, nan, 1),
       ('F', nan, nan, 1)])

我认为这行得通,但行不通:

pairs = [tuple((x[1] + x[3], x[2] + x[3])) for x in list_values if x[1] is not np.nan]

它returns这个:

[(2.0, 3.0), (4.0, 5.0), (6.0, 7.0), (nan, nan), (nan, nan), (nan, nan)]

而我想:

[(2.0, 3.0), (4.0, 5.0), (6.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:])]