搜索列表的最快方法是,它是否具有以指定字符串开头的元素,然后返回元素的索引(如果已找到)。
类似的东西:
2
它应该返回public IntegrationSqlDbDB(string configuration)
: base(configuration)
{
InitDataContext();
}
。
答案 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