在Python的编程中,我们希望找到某个元素在一个列表或者字符串的位置,通常使用.Index(x)方法,另外也可以对字符串使用.find(x)方法,但是无论是用.index(x)

或.find(x)方法,都只能返回第一个x出现的位置。如果x重复出现,如何能够快速查找处所有x的位置呢?

例如:有一个如下的列表L:

>>> L=range(20)*3
>>> L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19]

如果希望找到所有19出现的位置,我编写如下的程序:

def find_repeat(source,elmt): # The source may be a list or string.
elmt_index=[]
s_index = 0;e_index = len(source)
while(s_index < e_index):
try:
temp = source.index(elmt,s_index,e_index)
elmt_index.append(temp)
s_index = temp + 1
except ValueError:
break
return elmt_index
>>> find_repeat(L,19)
[19, 39, 59]
该程序也可用于字符串,例如:
>>> s= 'ababcdefgadema'
>>> find_repeat(s,'a')
[0, 2, 9, 13]

测试一下函数的运行时间:

import datetime
if __name__ == '__main__':
L = range(int(1e6))*4
t1 = datetime.datetime.now()
index_list = find_repeat(L,19)
t2 = datetime.datetime.now()
print index_list
print "It takes %s"%(t2-t1)
>>>
[19, 1000019, 2000019, 3000019]
It takes 0:00:00.062000

总共花费了62ms,

还不错!