Python 在列表中搜索以字符串开头的元素的最快方法?

Python 在列表中搜索以字符串开头的元素的最快方法?,python,string,python-3.x,list,search,Python,String,Python 3.x,List,Search,搜索列表是否包含以指定字符串开头的元素,然后在找到该元素时返回该元素的索引的最快方法是什么 比如: mylist=['one','two','three','four'] mystring='thr' 它应该返回2在这里,你不能得到比O(n)复杂度更好的结果,但一般来说,如果你追求纯粹的速度,那么就不要使用Python 我建议的规范Python解决方案是使用一个内存高效的生成器,并对其调用一次next >>> mylist = ['one','two','three','fo

搜索列表是否包含以指定字符串开头的元素,然后在找到该元素时返回该元素的索引的最快方法是什么

比如:

mylist=['one','two','three','four']
mystring='thr'

它应该返回
2

在这里,你不能得到比O(n)复杂度更好的结果,但一般来说,如果你追求纯粹的速度,那么就不要使用Python

我建议的规范Python解决方案是使用一个内存高效的生成器,并对其调用一次
next

>>> mylist = ['one','two','three','four']
>>> mystring = 'thr'
>>> next(index for index, item in enumerate(mylist) if item.startswith('thr'))
2

默认情况下,如果条件从未满足,这将给您一个
StopIteration
异常。如果需要回退值,您可以向
next
提供第二个参数。

索引=[i for i,s in enumerate(mylist)if s.startswith('thr')]

mystring='thr'
[n for (n,item) in enumerate(mylist) if item.startswith(mystring)][0]
Out: 2

Enumerate稍快一些

如果要执行多个搜索,则可以对列表进行组织,使每个搜索的执行时间优于O(n)。显然,如果您只进行一次搜索,那么重新组织列表的开销将是巨大的

import bisect
mylist.sort()
n = bisect.bisect_left(mylist, mystring)
if n >= len(mylist) or not mylist[n].startswith(mystring):
    print('not found')
如果你需要保持原来的秩序,那只会稍微复杂一点

mysorted = sorted((s,i) for i,s in enumerate(mylist))
n = bisect.bisect_left(mysorted, (mystring, 0))
if n >= len(mysorted) or not mysorted[n][0].startswith(mystring):
    print('not found')
else:
    n = mysorted[n][1]

只要开个柜台就行了

i = 0
mylist = ['one','two','three','four']
mystring = 'thr'
for x in mylist:
    if mystring in x:
       i = i + 1
       print (i)
    else:
       i = i + 1
虽然这将打印“3”而不是“2”


我希望这会有所帮助。

最快的方法是不使用Python完成此任务。那么,合理的速度和可读性是否足够?您将搜索多少次,而列表更改的频率是多少?展示您所拥有的,我们将告诉您是否可以改进。更好的是:如果你有工作代码,请继续询问,因为他们专门改进工作代码,而不是像这里所做的那样修复损坏的代码。@timget et all,只进行一次搜索,列表不会更改,我想要python的最佳方法,我不使用其他语言,因此python3.x可以使用的合理最快的方法可以满足,谢谢!+1用于忽略约束较差的“最快”请求,并提供最具Pythonic的请求。默认情况下,它会在不更改第二个参数的情况下引发stopiteration
mystring='hr'
。在功能中使用
不需要从开始。