a.index(float('nan')) fails

MRAB python at mrabarnett.plus.com
Thu Oct 25 22:19:38 EDT 2012


On 2012-10-26 03:04, Terry Reedy wrote:
> On 10/25/2012 9:46 PM, mamboknave at gmail.com wrote:
>>>>> a = [float('nan'), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>>> a
>> [nan, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>>> a.index(float('nan'))
>> Traceback (most recent call last):
>>    File "<stdin>", line 1, in <module>
>> ValueError: list.index(x): x not in list
>>
>> That means, the function .index() cannot detect nan values.
>> It happens on both Python 2.6 and Python 3.1
>>
>> Is this a bug? Or I am not using .index() correctly?
>
> It is a consequence of the following, which some people (but not all)
> believe is mandated by the IEEE standard.
>
>   >>> nan = float('nan')
>   >>> nan is nan
> True
>   >>> nan == nan
> False
>
>   >>> nanlist = [nan]
>   >>> nan in nanlist
> True
>   >>> nanlist.index(nan)
> 0
>
> Containment of nan in collection is tested by is, not ==.
>
>   >>> nan2 = float('nan')
>   >>> nan2 is nan
> False
>   >>> nan2 == nan
> False
>   >>> nan2 in nanlist
> False
>
In summary, .index() looks for an item which is equal to its argument,
but it's a feature of NaN (as defined by the standard) that it doesn't
equal NaN, therefore .index() will never find it.

Another consequence is that the presence of a NaN in a list prevents
.sort() from sorting correctly.




More information about the Python-list mailing list