Использование enumerate
- это стандартный путь.Хотя вы можете воспользоваться скоростью str.find
для операций, критичных ко времени.
Код
def find_all(s, c):
idx = s.find(c)
while idx != -1:
yield idx
idx = s.find(c, idx + 1)
print(*find_all('Apples are totally awesome', 'o')) # 12 23
Я сделал приведенный выше возврат генератора для элегантности и для учета очень большойстроки.Положить его, конечно, можно при необходимости на list
.
Тест
Вот эталонное решение для решения, использующего enumerate
и понимание списка.Оба решения имеют линейную сложность по времени, но str.find
значительно быстрее.
import timeit
def find_all_enumerate(s, c):
return [i for i, x in enumerate(s) if c == 'a']
print(
'find_all:',
timeit.timeit("list(find_all('Apples are totally awesome', 'o'))",
setup="from __main__ import find_all")
)
print(
'find_all_enumerate:',
timeit.timeit("find_all_enumerate('Apples are totally awesome', 'o')",
setup="from __main__ import find_all_enumerate")
)
Вывод
find_all: 1.1554179692960915
find_all_enumerate: 1.9171753468076869