2011-08-29 37 views
11

En este momento estoy seguimiento de mi índice en el lado del bucle como éste¿Cuál es la forma correcta de rastrear índices en python?

index = 0 
for entry in longList: 
    if entry == 'foo': 
     print index 
    index += 1 

hay una mejor manera de hacer esto?

+0

¿Qué es exactamente lo que quieres hacer? –

+1

http://stackoverflow.com/questions/1185545/python-loop-counter-in-a-for-loop/1185557#1185557 – develerx

Respuesta

18
for index, entry in enumerate(longList): 
    if entry == 'foo': 
     print index 
5

Sí, la mejor manera es hacer esto:

longList.index('foo') 
+1

+1, sin embargo, esto aumentará 'ValueError' si' "foo" 'isn ' t un miembro de 'longList' mientras que el código de OP simplemente no imprimirá nada. –

+8

Y si nos estamos volviendo particulares, no encontrará duplicados. –

+2

Estaba haciendo esto, pero cuando lo ejecuto en varios miles de entradas se vuelve cada vez más lento cuanto más profundo entro en la lista. Por eso estoy usando el bucle que estoy usando ahora. – John

10

Uso del enumerate() función incorporada.

for index, entry in enumerate(longList): 
    if entry == 'foo': 
     print index 

Sin embargo, en su caso específico, puede hacerlo simplemente index = longList.index("foo")

EDITAR: Si usted quiere encontrar los índices de varias coincidencias más o menos tan rápido como es posible en Python puro, la siguiente código debería hacer el truco:

indices = tuple(index for index, element in enumerate(longList) if element=='foo') 
3

El uso de enumerar sería una mejor idea.

for ind,item in enumerate(longList): 
    if item == 'foo': 
     print ind 
6

me gusta lista por comprensión :)

[index for (index,entry) in enumerate(longList) if entry == 'foo'] 
+0

+1, pero los paréntesis alrededor de '(índice, entrada)' no son necesarios. Recuerde, en las comas de Python hacer tuplas, no paréntesis. Además, generalmente es mejor utilizar una expresión de generador en lugar de una lista de comprensión. Entonces, '(índice para índice, entrada en enumerate (longList) si entry == 'foo')'. –

+1

con paréntesis es más fácil de leer para mí :) De hecho, si solo desea imprimir, tome un generador. – steabert

3

Si la lista es muy larga y estática, se debe considerar el uso de una tabla de consulta (en realidad, un diccionario de listas de índices con la entrada como la clave) Casi se amortizará después de la primera búsqueda, ya que actualmente siempre itera sobre todos los elementos.

from collections import defaultdict 

# Create and fill the table (only once or whenever the list changes) 
lookupTable = defaultdict(list) 
for index, entry in enumerate(longList): 
    lookupTable[entry].append(index) 

# Search the list (as many times as you want) 
indexes = lookupTable.get('foo') 
# and you get either 'None' or a list of indexes '[1,10,20]' 
+0

+1 Pude ver muchas aplicaciones para esto, tendré que investigar un poco sobre esto. – John

Cuestiones relacionadas