¿Cómo encontrar char en cadena y obtener todos los índices?

Tengo un código simple:

def find(str, ch): for ltr in str: if ltr == ch: return str.index(ltr) find("ooottat", "o") 

La función solo devuelve el primer índice. Si cambio volver a imprimir, se imprimirá 0 0 0. ¿Por qué es esto y hay alguna manera de obtener 0 1 2 ?

Esto se debe a que str.index(ch) devolverá el índice donde ch produce la primera vez. Tratar:

 def find(s, ch): return [i for i, ltr in enumerate(s) if ltr == ch] 

Esto devolverá una lista de todos los índices que necesita.

La respuesta de PS Hugh muestra una función de generador (hace una diferencia si la lista de índices puede boost). Esta función también se puede ajustar cambiando [] a () .

Me gustaría ir con Lev, pero vale la pena señalar que si terminas con búsquedas más complejas que vale la pena tener en cuenta utilizando re.finditer (pero a menudo causan más problemas que vale la pena, pero a veces es útil saberlo)

 test = "ooottat" [ (i.start(), i.end()) for i in re.finditer('o', test)] # [(0, 1), (1, 2), (2, 3)] [ (i.start(), i.end()) for i in re.finditer('o+', test)] # [(0, 3)] 
 def find_offsets(haystack, needle): """ Find the start of all (possibly-overlapping) instances of needle in haystack """ offs = -1 while True: offs = haystack.find(needle, offs+1) if offs == -1: break else: yield offs for offs in find_offsets("ooottat", "o"): print offs 

resultados en

 0 1 2 

La respuesta de Lev es la que yo usaría, sin embargo, aquí hay algo basado en su código original:

 def find(str, ch): for i, ltr in enumerate(str): if ltr == ch: yield i >>> list(find("ooottat", "o")) [0, 1, 2] 

Podrías probar esto

 def find(ch,string1): for i in range(len(string1)): if ch == string1[i]: pos.append(i) 

Usando pandas podemos hacer esto y devolver un dictado con todos los índices, versión simple:

 import pandas as pd d = (pd.Series(l) .reset_index() .groupby(0)['index'] .apply(list) .to_dict()) 

Pero también podemos construir en condiciones, por ejemplo, solo si hay dos o más ocurrencias:

 d = (pd.Series(l) .reset_index() .groupby(0)['index'] .apply(lambda x: list(x) if len(list(x)) > 1 else None) .dropna() .to_dict()) 
 x = "abcdabcdabcd" print(x) l = -1 while True: l = x.find("a", l+1) if l == -1: break print(l)