繁体   English   中英

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

[英]Fastest way to search list for an element that begins with a string?

搜索列表是否具有以指定字符串开头的元素,然后找到该元素的索引的最快方法是什么。

就像是:

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提供第二个参数。

indices = [i for i, s in enumerate(mylist) if s.startswith('thr')]
枚举稍微快一点

如果您要做的不仅仅是一个搜索,则可以以某种方式组织列表,以使每次搜索的执行时间都胜过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”。

我希望这有帮助。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM