Python 中 nan 和 'nan' 的区别

Difference between nan and 'nan' in Python

我有两个列表

a = ['E300' 'E407' 'nan' 'nan' 'nan' 'nan' 'nan' 'nan' 'nan' 'nan' ]
b = [ nan  nan  nan  nan  nan  nan  nan  nan  nan  nan  nan  nan  nan]

我想从列表中删除 nan。所以我在列表 'a' 和 'b'

上使用了这个
a = [x for x in a if x != 'nan']
b = [x for x in b if x != 'nan']

所以它适用于列表 'a' 因为我认为它是将 'nan' 作为字符串而不是列表 b。我怎样才能从列表 b 中删除那些 nan。提前致谢。

不加引号时,nan是一个数字(是用来表示不存在的结果的特殊数字,叫做"Not a Number")。它是如此特别,以至于它甚至不等于自己。使用 math.isnannumpy.isnan 测试数字是否为 nan

b = [x for x in b if not math.isnan(x)]

'nan' 是一个字符串

nan 不是数字,可以通过math.isnan()

方法查看
>>> nan=float('nan')
>>> math.isnan(nan)
True

你的情况:

b = [x for x in b if not math.isnan(x)]

'nan'是字符串,而nan是浮点数。这很有趣,因为 "nan" 代表 Not A Number,但它确实是这样的:

>>> type(nan)
<class 'float'>

nan 有许多棘手的属性,其中最棘手的是它比较不等于 一切包括它自己.你必须使用一个特殊的函数来检查它,math.isnan

>>> b
[nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]
>>> [x for x in b if x != nan]
[nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]
>>> [x for x in b if not math.isnan(x)]
[]

注意:Python 没有定义内置常量 nan,即使 NaN 值的 reprnan。 (对比TrueFalseNone等)3.5及以后的有math.nan,但之前要说float('nan').