关于字符串:Python:为什么列表没有find方法?

Python: Why Lists do not have a find method?

我试图为这个问题写一个答案,很惊讶地发现列表没有find方法,列表只有index方法(字符串有find和index)。

有人能告诉我这背后的理由吗?为什么弦都有?


我不知道为什么或者可能埋在某个PEP中,但是我知道2个非常基本的列表"查找"方法,它们是array.index()in操作符。你总是可以利用这2个来找到你的物品。(同样,重新模块等)


我认为没有单独的"查找"和"索引"方法的理由是它们没有足够的不同。两种方法都会返回相同的结果,如果所需项存在于列表中(这对于两个字符串方法是正确的);如果所需项不在列表/字符串中,则它们会有所不同;但是,您可以轻松地从另一种方法构建find/index中的任何一种。如果您来自其他语言,那么对于您可以轻松测试的非错误条件,引发和捕获异常似乎是不礼貌的做法,但是在Python中,通常认为先拍摄然后再问问题更像是Python式的,呃,使用异常处理而不是像这样的测试(例如:更好地"尝试"一些东西并捕获异常或测试,如果可能的话,首先要避免异常?).

我不认为把"find"建立在"index"和"in"之外是个好主意,比如

1
2
3
4
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"中构建"find"并尝试/catch,例如:

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

现在,关于为什么列表是这样构建的(只有索引),而字符串是以另一种方式构建的(有单独的索引和查找)。我说不上来。


列表的"查找"方法是index

我认为string.findlist.index之间的不一致是很不幸的,无论是在名义上还是行为上:string.find在没有找到匹配时返回-1,而list.index会导致值错误。这本可以设计得更加一致。这些操作之间唯一不可调和的区别是,string.find搜索一个项目字符串,其中list.index只搜索一个项目(仅此一项,不能证明使用不同的名称是正确的)。