Python:为什么列表没有find方法?

16 投票
3 回答
20067 浏览
提问于 2025-04-16 04:55

我在尝试给这个问题写答案的时候,发现列表没有像字符串那样的find方法,这让我感到很惊讶。列表只有index方法,而字符串则有find和index两个方法。

有没有人能告诉我这是为什么呢?为什么字符串有两个方法呢?

3 个回答

2

在列表中查找元素的方法是 index

我觉得 string.findlist.index 之间的不一致很可惜,不论是名字还是行为上都不太一样:当没有找到匹配项时,string.find 会返回 -1,而 list.index 则会抛出一个 ValueError 错误。这本来可以设计得更一致一些。这两个操作之间唯一无法调和的区别是,string.find 是在查找一串字符,而 list.index 是在查找一个具体的元素(光这一点也不足以让它们用不同的名字)。

4

我觉得没有单独的“find”和“index”方法的原因是这两者之间的区别不大。如果你在列表中找的东西存在,这两个方法返回的结果是一样的(这在字符串的两个方法中也是如此)。不过,如果你找的东西不在列表或字符串里,它们的表现就不一样了;但其实你可以很简单地用一个方法来实现另一个。如果你来自其他编程语言,可能会觉得在没有错误的情况下抛出和捕获异常有点不礼貌,因为你可以很容易地进行测试,但在Python中,通常认为直接尝试再处理异常更符合Python的风格,也就是用异常处理来代替这种测试(例如:是先“尝试”某个操作再捕获异常,还是先测试一下是否可能以避免异常更好?)。

我觉得用“index”和“in”来构建“find”并不是个好主意,像这样:

if foo in my_list:
   foo_index = my_list.index(foo)
else:
    foo_index = -1 # or do whatever else you want

因为“in”和“index”都需要对列表进行一次O(n)的遍历。

更好的做法是用“index”和try/catch来构建“find”,像这样:

try:
    foo_index = my_list.index(foo)
catch ValueError:
    foo_index = -1 # or do whatever else you want

至于为什么列表是这样设计的(只有index),而字符串是另一种方式(有单独的index和find)……我就不太清楚了。

7

我不知道为什么,或者可能这个原因藏在某个PEP文档里,但我知道有两种非常基本的“查找”方法可以用在列表上,它们分别是 array.index()in 操作符。你总是可以使用这两种方法来查找你的项目。(还有 re 模块等等)

撰写回答