Постановка задачи
Если вам дана строка, давайте назовем ее 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