¿Cómo encontrar el índice de la vez n un elemento aparece en una lista?

Dado:

x = ['w', 'e', 's', 's', 's', 'z','z', 's'] 

Cada aparición de s aparece en los siguientes índices:

1: 2
2do: 3
3: 4
4: 7

Si hago x.index('s') obtendré el primer índice.

¿Cómo obtengo el índice de los 4 s ?

Usando lista de comprensión y enumerate :

 >>> x = [ 'w', 'e', 's', 's', 's', 'z','z', 's'] >>> [i for i, n in enumerate(x) if n == 's'][0] 2 >>> [i for i, n in enumerate(x) if n == 's'][1] 3 >>> [i for i, n in enumerate(x) if n == 's'][2] 4 >>> [i for i, n in enumerate(x) if n == 's'][3] 7 

Si no desea almacenar los índices para cada ocurrencia, o si desea trabajar con iterables arbitrarios, algo como:

 from itertools import islice def nth_index(iterable, value, n): matches = (idx for idx, val in enumerate(iterable) if val == value) return next(islice(matches, n-1, n), None) x = [ 'w', 'e', 's', 's', 's', 'z','z', 's'] idx = nth_index(x, 's', 4) # 7 

Tenga en cuenta que hay un valor predeterminado de None allí en el next . Es posible que desee cambiarlo por otra cosa, o eliminarlo y capturar el StopIteration y elevarlo como otra excepción más adecuada ( ValueError por ejemplo, para que se relacione más con el comportamiento de list.index ).

Para obtener el índice de los ítems:

 return [index for index, char in enumerate(x) if char == 's'] 

Para conseguir el propio personaje:

 return [char for index, char in enumerate(x) if char == 's'] 

O para obtener tuplas de pares de caracteres / índice: (Gracias a falsetru por señalar una solución más simple)

 pairs = [(index, char) for index, char in enumerate(x) if char == 's'] 
 def find_nth_character(str1, substr, n): """find the index of the nth substr in string str1""" k = 0 for index, c in enumerate(str1): #print index, c, n # test if c == substr: k += 1 if k == n: return index str1 = "B.765.A87_43.Left.9878.xx8" substr = '.' occurance = 4 print "%s #%d at index %d" % (substr, occurance, find_nth_character(str1, substr, occurance)) 

Aquí hay un enfoque más Pythonic que usa itertools.count y una expresión generadora:

 In [24]: def get_nth_index(lst, item, n): ...: c = count() ...: return next(i for i, j in enumerate(x) if j=='s' and next(c) == n-1) 

Manifestación:

 In [25]: get_nth_index(x, 's', 2) Out[25]: 3 In [26]: get_nth_index(x, 's', 3) Out[26]: 4 In [27]: get_nth_index(x, 's', 4) Out[27]: 7 In [28]: get_nth_index(x, 's', 5) --------------------------------------------------------------------------- StopIteration Traceback (most recent call last)  in () ----> 1 get_nth_index(x, 's', 5)  in get_nth_index(lst, item, n) 1 def get_nth_index(lst, item, n): 2 c = count() ----> 3 return next(i for i, j in enumerate(x) if j=='s' and next(c) == n-1) StopIteration: In [29]: 

Como puede ver, generará una excepción StopIteration en caso de que no pueda encontrar una coincidencia. También puede pasar un argumento predeterminado a la función next() para devolver un valor predeterminado en lugar de generar una excepción.