在Python中,如何找到列表中第一个不是某值的项的索引?

16 投票
5 回答
17488 浏览
提问于 2025-04-15 22:13

Python的列表类型有一个叫做index(x)的方法。这个方法需要一个参数x,然后返回列表中第一个值等于x的项的索引(位置),这个索引是一个整数。

简单来说,我想要反向使用这个index(x)方法。我需要找到列表中第一个不等于x的值的索引。我可能甚至可以用一个函数来返回第一个值不为None的项的索引。

我想到可以用一个'for'循环来实现,里面有一个计数器变量在递增,但我觉得我可能遗漏了什么。有没有现成的方法,或者一行代码的Python写法可以做到这一点呢?

在我的程序中,这种情况出现在处理复杂正则表达式匹配返回的列表时。每个列表中除了一个项外,其他项的值都是None。如果我只需要匹配到的字符串,我可以用列表推导式,比如'[x for x in [my_list] if x is not None]',但我需要索引来确定我的正则表达式中哪个捕获组实际上导致了匹配。

5 个回答

4

enumerate() 是一个函数,它会返回一个可以逐个取出值的对象。这个对象每次给你一个包含两个部分的元组:一个是当前的索引(位置),另一个是你正在遍历的项目(内容)本身。

5

我觉得在只需要第一个元素的时候用列表推导式有点不太妥当。还是用一个循环,然后提前退出比较好。

>>> lst = [None, None, None, "foo", None]
>>> for i, item in enumerate(lst):
...   if item: break
... else:
...   print "not found"
... 
>>> i
3
17

在找到第一个匹配项后退出其实很简单:与其计算出一个完整的列表再丢掉除了第一个以外的所有项,不如使用next结合生成器表达式。假设你想要在没有任何项满足条件(即不等于x)时返回-1

return next((i for i, v in enumerate(L) if v != x), -1)

这是Python 2.6的语法;如果你还在用2.5或更早的版本,.next()是生成器表达式(或其他迭代器)的方法,并且不接受像上面提到的-1这样的默认值(所以如果你不想看到StopIteration的异常,你就得用try/except来处理)。不过,2.5之后发布了更多版本,确实是因为语言和内置功能在不断改进!-)

撰写回答