Python:为什么列表没有find方法?
我在尝试给这个问题写答案的时候,发现列表没有像字符串那样的find方法,这让我感到很惊讶。列表只有index方法,而字符串则有find和index两个方法。
有没有人能告诉我这是为什么呢?为什么字符串有两个方法呢?
3 个回答
在列表中查找元素的方法是 index
。
我觉得 string.find
和 list.index
之间的不一致很可惜,不论是名字还是行为上都不太一样:当没有找到匹配项时,string.find
会返回 -1,而 list.index
则会抛出一个 ValueError 错误。这本来可以设计得更一致一些。这两个操作之间唯一无法调和的区别是,string.find
是在查找一串字符,而 list.index
是在查找一个具体的元素(光这一点也不足以让它们用不同的名字)。
我觉得没有单独的“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)……我就不太清楚了。
我不知道为什么,或者可能这个原因藏在某个PEP文档里,但我知道有两种非常基本的“查找”方法可以用在列表上,它们分别是 array.index()
和 in
操作符。你总是可以使用这两种方法来查找你的项目。(还有 re 模块等等)