Using enumerate
是标准的方法。虽然,您可以利用速度str.find
用于时间关键的操作。
Code
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 == x]
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")
)
Output
find_all: 1.1554179692960915
find_all_enumerate: 1.9171753468076869