2009-06-07 7 views
5

Es gibt eine nette Klasse Enum von enum, aber es funktioniert nur für Strings. Ich bin derzeit mit:Wie liste ich eine Liste von Nicht-String-Objekten in Python auf?

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

Ich denke, es ist nicht die optimale Lösung aufgrund der vorzeitigen Anwendung von len. Wie ist es möglich, es effizienter zu machen?

Antwort

12

Hier ist der pythonic Weg, diese Schleife zu schreiben:

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

enumerate Arbeiten auf einem beliebigen Reihenfolge unabhängig von der Art ihrer Elemente. Es ist eine eingebaute Funktion.

Edit:

Nach einigen timeit Tests laufen mit Python 2.5, fand ich enumerate etwas langsamer zu sein:

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

Ist es effizienter? –

+0

@Bastien - Nach einigen Zeittests fand ich 'enumerate' etwas langsamer als der Code in der Frage. Ich werde meine Antwort aktualisieren. –

+0

in py3k Ergebnisse sind ziemlich entgegengesetzt: Bereich Version ist 3 mal langsamer als Enumerate-Version. – SilentGhost