2009-06-07 9 views
5

Hay una bonita clase Enum de enum, pero solo funciona con cadenas. Actualmente estoy usando:¿Cómo enumerar una lista de objetos que no sean cadenas en Python?

for index in range(len(objects)): 
     # do something with index and objects[index] 

supongo que no es la solución óptima debido al uso prematuro de len. ¿Cómo es posible hacerlo de manera más eficiente?

Respuesta

12

Aquí es la forma Pythonic escribir este bucle:

for index, obj in enumerate(objects): 
    # Use index, obj. 

enumerate obras en cualquier secuencia, independientemente de los tipos de sus elementos. Es una función incorporada.

Editar:

Después de ejecutar algunas pruebas timeit utilizando Python 2.5, encontré enumerate ser ligeramente más lento:

>>> timeit.Timer('for i in xrange(len(seq)): x = i + seq[i]', 'seq = range(100)').timeit() 
10.322299003601074 
>>> timeit.Timer('for i, e in enumerate(seq): x = i + e', 'seq = range(100)').timeit() 
11.850601196289062 
+0

¿Es más eficiente? –

+0

@Bastien - Después de algunas pruebas de tiempo, encontré 'enumerate' para ser un poco más lento que el código en la pregunta. Actualizaré mi respuesta. –

+0

en py3k los resultados son bastante opuestos: la versión de rango es 3 veces más lenta que la versión de enumerar. – SilentGhost

Cuestiones relacionadas