2009-06-07 8 views
5

Il existe une belle classe Enum de enum, mais elle ne fonctionne que pour les chaînes. J'utilise actuellement:Comment énumérer une liste d'objets non-string en Python?

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

Je suppose que ce n'est pas la solution optimale en raison de l'utilisation prématurée de len. Comment est-il possible de le faire plus efficacement?

Répondre

12

Voici la façon pythonique d'écrire cette boucle:

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

enumerate fonctionne sur toute séquence indépendamment des types de ses éléments. C'est une fonction intégrée.

Edit:

Après avoir exécuté quelques tests à l'aide timeit Python 2.5, je trouve enumerate être un peu plus lent:

>>> 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

est-il plus efficace? –

+0

@Bastien - Après quelques tests de temps, j'ai trouvé que 'enumerate' était légèrement plus lent que le code de la question. Je vais mettre à jour ma réponse. –

+0

dans les résultats de py3k sont tout à fait opposés: la version de gamme est 3 fois plus lente que la version d'énumération. – SilentGhost

Questions connexes