我试图写一个这个question的答案,并且很惊讶地发现没有列表的查找方法,列表只有索引方法(字符串有查找和索引)。
有谁可以告诉我背后的理由? 为什么字符串都有?
答案 0 :(得分:7)
我不知道为什么或者可能隐藏在某个PEP的某个地方,但我确实知道列表的2个非常基本的“查找”方法,它们是array.index()
和in
运算符。您可以随时使用这些2来查找您的商品。 (另外,重新模块等)
答案 1 :(得分:3)
我认为没有单独的'发现'和'索引'方法的理由是他们没有足够的差异。如果列表中存在所寻找的项目,则两者都会返回相同的内容(两个字符串方法都是如此);如果所寻求的项目不在列表/字符串中,它们会有所不同;但是你可以从另一个中轻松地构建find / index中的任何一个。如果你来自其他语言,那么你可以很容易地测试非错误条件来提高和捕获异常似乎是不礼貌的行为,但是在Python中,它通常被认为是更先进的pythonic并且稍后会提出问题,呃,使用异常处理而不是像这样的测试(例如:Better to 'try' something and catch the exception or test if its possible first to avoid an exception?)。
我不认为从'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'构建'find'并尝试/ catch,如:
try:
foo_index = my_list.index(foo)
catch ValueError:
foo_index = -1 # or do whatever else you want
现在,为什么列表是以这种方式构建的(仅使用索引),而字符串是以另一种方式构建的(使用单独的索引和查找)...我不能说。
答案 2 :(得分:2)
列表的“查找”方法是index
。
我确实认为string.find
和list.index
之间的不一致在名称和行为上都是不幸的:string.find
在找不到匹配项时返回-1,其中list.index
引发ValueError。这可以设计得更加一致。这些操作之间唯一不可调和的区别是string.find
搜索一系列项目,其中list.index
只搜索一个项目(单独使用不同的名称不合理)。