比较包含NaN的列表

发布于 2021-01-29 16:33:09

我试图比较两个不同的列表以查看它们是否相等,并且打算删除NaN,但是发现我的列表比较仍然有效,尽管NaN == NaN -> False

有人可以解释为什么下面的结果为TrueFalse,因为我发现此行为是意外的。谢谢,

我已阅读以下内容,似乎无法解决该问题:

(Python 2.7.3,numpy-1.9.2)

我用*结尾标记了令人惊讶的评估

>>> nan = np.nan
>>> [1,2,3]==[3]
False
>>> [1,2,3]==[1,2,3]
True
>>> [1,2,nan]==[1,2,nan]
True ***
>>> nan == nan
False
>>> [nan] == [nan]
True ***
>>> [nan, nan] == [nan for i in range(2)]
True ***
>>> [nan, nan] == [float(nan) for i in range(2)]
True ***
>>> float(nan) is (float(nan) + 1)
False
>>> float(nan) is float(nan)
True ***
关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    要了解这里发生的情况,只需替换nan = np.nanfoo = float('nan'),您将得到完全相同的结果,为什么?

    >>> foo = float('nan')
    >>> foo is foo # This is obviously True! 
    True
    >>> foo == foo # This is False per the standard (nan != nan).
    False
    >>> bar = float('nan') # foo and bar are two different objects.
    >>> foo is bar
    False
    >>> foo is float(foo) # "Tricky", but float(x) is x if type(x) == float.
    True
    

    现在认为这numpy.nan只是一个包含float('nan')。的变量名。

    现在为什么[nan] == [nan]仅仅是因为list比较首先要在项目之间进行身份平等性的检验,然后才是价值相等,所以将其视为:

    def equals(l1, l2):
        for u, v in zip(l1, l2):
            if u is not v and u != v:
                return False
        return True
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看