Python中的list.index()函数不抛出异常的实现

133 投票
9 回答
81715 浏览
提问于 2025-04-17 06:40

在Python中,使用list.index(x)这个方法,如果你查找的项目不存在,它会抛出一个错误。这种情况下,有没有更好的方法可以做到这一点,而不需要处理这些错误呢?

9 个回答

7

总结:异常是你的好朋友,这种方法是解决问题的最佳选择。
与其提前请求许可,不如事后求得宽恕(EAFP)

提问者在评论中澄清,对于他们的使用场景,实际上并不需要知道索引是什么。正如被接受的答案所指出的,如果你不在乎索引,那么使用 x in somelist 是最好的选择。

但我假设,正如原问题所暗示的,你确实在乎索引是什么。在这种情况下,我要指出,其他所有解决方案都需要扫描列表两次,这可能会导致性能下降。

此外,正如著名的雷蒙德·赫廷格在评论中所说:

即使我们有一个返回 -1 的 list.find,你仍然需要检查 i 是否等于 -1,并采取相应的行动。

所以我想反驳原问题中关于应该避免异常的假设。我认为异常是你的好朋友。它们并不可怕,也并不低效,实际上你需要熟悉它们才能写出好的代码。

因此,我认为最好的答案就是简单地使用 try-except 方法:

try:
    i = somelist.index(x) 
except ValueError:
    # deal with it

处理它”只是意味着做你需要做的事情:将 i 设置为一个哨兵值,抛出你自己的异常,走不同的代码分支等等。

这就是为什么 Python 的原则 与其请求许可,不如事后求得宽恕(EAFP) 有意义的原因,这与 先看再跳(LBYL) 的 if-then-else 风格形成对比。

11

自己为列表实现一个索引?

class mylist(list):
  def index_withoutexception(self,i):
    try:
        return self.index(i)
    except:
        return -1

你可以使用列表,然后用你的索引2来返回你想要的内容,以防出现错误。

你可以这样使用:

  l = mylist([1,2,3,4,5]) # This is the only difference with a real list
  l.append(4) # l is a list.
  l.index_withoutexception(19) # return -1 or what you want
125

如果你不在乎匹配的元素在哪里,那就用:

found = x in somelist

如果你在乎的话,那就用一种叫做 LBYL 的风格,配合一个 条件表达式

i = somelist.index(x) if x in somelist else None

撰写回答