【发布时间】:2019-04-29 13:40:42
【问题描述】:
问题陈述
如果给你一个字符串,我们就叫它target,你能把target在一些输入字符串列表中的所有索引都给我吗(这很重要,它是一个字符串列表而不是数字) ,我们称之为input_list。示例输入:
target = '1234'
input_list = [str(x) for x in range(30000)] + [str(x) for x in range(30000)]
您不能假设input_list 已排序,如果您想对列表进行排序,您需要将其添加到您自己的benchmarkFind() 版本中。简单的解决方案是执行以下操作,但这可能非常低效:
def benchmarkFind(target,input_list):
out = []
for i in range(len(input_list)):
if input_list[i] == target:
out.append(i)
return out
这里的答案是:
idx = [1234, 31234]
基准测试结果
>>> %timeit benchmarkFind(target,input_list)
100 loops, best of 3: 3.07 ms per loop
用户评论结果
来自@trincot 和@Abhinav Sood - 稍微好一点,但不是很好。
def enumerateFind(target,input_list):
return [i for i, e in enumerate(input_list) if e == target]
>>> %timeit enumerateFind(target,input_list)
100 loops, best of 3: 2.96 ms per loop
来自@B。 M - 这看起来是迄今为止最好的答案!
def primitiveFind(target ,input_list):
try :
l=[]
u=-1
while True:
u = input_list.index(target,u+1)
l.append(u)
except ValueError:
return l
>>> %timeit primitiveFind(target,input_list)
1000 loops, best of 3: 577 µs per loop
【问题讨论】:
-
如果您要返回整个列表,那么创建生成器没有任何优势。你试过
[i for i, val in enumerate(input_list) if val == target]吗? -
@trincot 是的。尽管这确实通常更快,而且速度并不快。我已经更新了问题陈述以澄清问题,并提供了一个包含您的建议的示例。
-
计时结果实际上取决于列表相对于搜索值的稀疏程度。另见this answer and comments。以前有人问过这个问题。
标签: python list performance indexing