检索列表中 NaN 的索引

Posted

技术标签:

【中文标题】检索列表中 NaN 的索引【英文标题】:Retrieving the index of NaN in a list 【发布时间】:2018-12-14 14:48:17 【问题描述】:

我有一个类似的列表:

li = [nan, 'Grvl', 'Pave']

另外两项是字符串,但 nan 不是变量。它是一个 Not A Number 浮点数。

type(li[0])
>> <class 'float'>

现在我希望能够通过以下方式索引 nan:

li.index(float('nan'))

但是有一个错误:

ValueError: nan is not in list

如何获取nan的索引?我正在使用 Python 3.5。

【问题讨论】:

【参考方案1】:

利用数学上 NaN != NaN 这一事实,因此您可以将生成器传递给 next 以获取 NaN 的第一个索引,如果不存在则为 -1。

nan_idx = next((i for i, v in enumerate(li) if v != v), -1)

print(nan_idx) 
0

【讨论】:

【参考方案2】:

您可以使用math.isnan() 编写通用自定义函数来获取列表中带有或不带有NaN 值的元素的索引。

from match import isnan

def nan_index(my_list, el):
    if isinstance(el, float) and isnan(el):
        for i, e in enumerate(my_list):
            if isnan(e):
                return i
        else:
            raise ValueError
    else:
        return my_list.index(el)

示例运行:

>>> nan_index([1, 2, 4, 5], 4)  # For list of numbers 
2

>>> nan_index(['a', 'b', 'c'], 'b')  # For list of strings
1

>>> nan_index([1, 2, 4, float('nan')], float('nan'))  # For list with `NaN`
3

>>> nan_index([1, 2, 4, 5], float('nan'))  # "ValueError", for list without match
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in nan_index
ValueError

【讨论】:

以上是关于检索列表中 NaN 的索引的主要内容,如果未能解决你的问题,请参考以下文章

从特定索引处的列表中检索值

如何使用 itextsharp 从 PDF 的列表框中检索用户选择的索引?

检索 Access 数据库中的索引列表

如何遍历列表并检索最小值的索引但忽略输出列表中的重复项?

如何在不刷新网页的情况下从下拉列表索引更改事件的数据库中检索数据

尝试从一系列字典中检索键时出现“类型错误:列表索引必须是整数或切片,而不是 str”