Iterieren Sie eine Liste mit Indizes in Python


203

Ich könnte schwören, dass ich die Funktion (oder Methode) gesehen habe, die eine Liste wie diese aufnimmt [3, 7, 19]und sie in eine iterierbare Liste von Tupeln verwandelt, wie folgt: [(0,3), (1,7), (2,19)]Verwenden Sie sie anstelle von:

for i in range(len(name_of_list)):
    name_of_list[i] = something

aber ich kann mich nicht an den Namen erinnern und googeln "iterate list" bekommt nichts.

Antworten:


354
>>> a = [3,4,5,6]
>>> for i, val in enumerate(a):
...     print i, val
...
0 3
1 4
2 5
3 6
>>>

107

Ja, das wäre die enumerateFunktion! Oder mehr auf den Punkt, müssen Sie tun:

list(enumerate([3,7,19]))

[(0, 3), (1, 7), (2, 19)]

2
Manchmal stellen die Leute eine Frage, die sich auf die bezieht, die sie wirklich wollen, manchmal sind sie etwas wahllos darüber, was "am besten" bedeutet.
Msw

3
Und manchmal lesen die Leute nur die ersten anderthalb Zeilen der Frage anstatt der ganzen Frage. Wenn Sie am Ende der zweiten Zeile angelangt sind, sagt er, dass er sie verwenden möchte. Stattdessen habe for i in range(len(name_of_list)):ich ein Beispiel mit einem für anstelle des im ersten Teil gezeigten angegeben.
Vinko Vrsalovic

1
@ HumphreyBogart Weil Lauren Bacall gerne ausführlicher ist.
Javadba

25

Hier ist eine andere, die die zipFunktion verwendet.

>>> a = [3, 7, 19]
>>> zip(range(len(a)), a)
[(0, 3), (1, 7), (2, 19)]

10
enumerate()ist ein bisschen eleganter, denke ich.
Nathan Fellman

14
@ Nathan: Aber zip () ist allgemeiner und funktioniert für beliebige Listenpaare, also ist es gut zu wissen.
ShreevatsaR

8

Hier ist es eine Lösung mit Kartenfunktion:

>>> a = [3, 7, 19]
>>> map(lambda x: (x, a[x]), range(len(a)))
[(0, 3), (1, 7), (2, 19)]

Und eine Lösung mit Listenverständnis:

>>> a = [3,7,19]
>>> [(x, a[x]) for x in range(len(a))]
[(0, 3), (1, 7), (2, 19)]

5

Die Python- enumerateFunktion wird Ihren Anforderungen gerecht

result = list(enumerate([1,3,7,12]))
print result

Ausgabe

[(0, 1), (1, 3), (2, 7),(3,12)]

2

Wenn Sie mehrere Listen haben, können Sie diese kombinieren enumerateund zip:

list1 = [1, 2, 3, 4, 5]
list2 = [10, 20, 30, 40, 50]
list3 = [100, 200, 300, 400, 500]
for i, (l1, l2, l3) in enumerate(zip(list1, list2, list3)):
    print(i, l1, l2, l3)
Ausgabe:
0 1 10 100
1 2 20 200
2 3 30 300
3 4 40 400
4 5 50 500

Beachten Sie, dass nachher eine Klammer erforderlich ist i. Andernfalls erhalten Sie die Fehlermeldung:ValueError: need more than 2 values to unpack

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.