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

时间:2018-03-15 21:30:55

标签: python string python-3.x list search

搜索列表的最快方法是,它是否具有以指定字符串开头的元素,然后返回元素的索引(如果已找到)。

类似的东西:

2

它应该返回public IntegrationSqlDbDB(string configuration) : base(configuration) { InitDataContext(); }

5 个答案:

答案 0 :(得分: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提供第二个参数。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果要进行多次搜索,可以组织列表,以便比每次搜索的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]

答案 3 :(得分:0)

只是运行一个计数器应该没问题

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'。

我希望这会有所帮助。

答案 4 :(得分:-1)

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