5459 Stimmen

Zugriff auf den Index in 'for'-Schleifen

Wie kann ich auf den Index in einer for Schleife?

xs = [8, 23, 45]

for x in xs:
    print("item #{} = {}".format(index, x))

Gewünschter Output:

item #1 = 8
item #2 = 23
item #3 = 45

112 Stimmen

Beachten Sie, dass Indizes in Python bei 0 beginnen, so dass die Indizes für Ihre Beispielliste 0 bis 4 und nicht 1 bis 5 sind

8936voto

Mike Hordecki Punkte 82281

Verwenden Sie die integrierte Funktion enumerate() :

for idx, x in enumerate(xs):
    print(idx, x)

Sie ist nicht-pythonisch manuell zu indizieren über for i in range(len(xs)): x = xs[i] oder manuell eine zusätzliche Zustandsvariable verwalten.

Überprüfen Sie PEP 279 für mehr.

146 Stimmen

Wie Aaron weiter unten ausführt, verwenden Sie start=1, wenn Sie 1-5 statt 0-4 erhalten möchten.

11 Stimmen

Hat enumerate keine weiteren Gemeinkosten verursachen?

11 Stimmen

@TheRealChx101 nach meinen Tests (Python 3.6.3) ist der Unterschied vernachlässigbar und manchmal sogar zu Gunsten von enumerate .

1316voto

Wie greife ich in einer for-Schleife auf den Schleifenindex zu, in diesem Fall von 1 bis 5?

Utilisez enumerate um den Index mit dem Element zu erhalten, während Sie iterieren:

for index, item in enumerate(items):
    print(index, item)

Und beachten Sie, dass die Indizes von Python bei Null beginnen, so dass Sie mit dem obigen Beispiel 0 bis 4 erhalten würden. Wenn Sie die Zählung von 1 bis 5 wollen, tun Sie dies:

count = 0 # in case items is empty and you need it after the loop
for count, item in enumerate(items, start=1):
    print(count, item)

Unidiomatischer Kontrollfluss

Was Sie wollen, ist das Pythonische Äquivalent des folgenden Algorithmus, den die meisten Programmierer niedrigerer Sprachen verwenden würden:

index = 0            # Python's indexing starts at zero
for item in items:   # Python's for loops are a "for each" loop 
    print(index, item)
    index += 1

Oder in Sprachen, die keine for-each-Schleife haben:

index = 0
while index < len(items):
    print(index, items[index])
    index += 1

oder manchmal häufiger (aber unidiomatisch) in Python zu finden:

for index in range(len(items)):
    print(index, items[index])

Verwenden Sie die Funktion Aufzählen

Pythons enumerate fonction reduziert die visuelle Unübersichtlichkeit, indem es die Buchhaltung für die Indizes ausblendet und die Iterable in eine andere Iterable kapselt (eine enumerate Objekt), das ein Zwei-Element-Tupel aus dem Index und dem Element ergibt, das die ursprüngliche iterable liefern würde. Das sieht wie folgt aus:

for index, item in enumerate(items, start=0):   # default is zero
    print(index, item)

Dieses Codebeispiel ist ziemlich gut die kanonisch Beispiel für den Unterschied zwischen Code, der idiomatisch für Python ist, und Code, der es nicht ist. Idiomatischer Code ist anspruchsvolles (aber nicht kompliziertes) Python, das so geschrieben ist, wie es verwendet werden soll. Idiomatischer Code wird von den Entwicklern der Sprache erwartet, was bedeutet, dass dieser Code in der Regel nicht nur besser lesbar, sondern auch effizienter ist.

Zählen lassen

Auch wenn Sie keine Indizes benötigen, sondern nur eine Zählung der Iterationen (was manchmal wünschenswert ist), können Sie damit beginnen 1 und die endgültige Zahl ist Ihre Zählung.

count = 0 # in case items is empty
for count, item in enumerate(items, start=1):   # default is zero
    print(item)

print('there were {0} items printed'.format(count))

Die Anzahl scheint eher das zu sein, was Sie zu verlangen beabsichtigen (im Gegensatz zum Index), als Sie sagten, Sie wollten von 1 bis 5.


Aufschlüsselung - eine schrittweise Erklärung

Um diese Beispiele aufzuschlüsseln, nehmen wir an, wir haben eine Liste von Elementen, über die wir mit einem Index iterieren wollen:

items = ['a', 'b', 'c', 'd', 'e']

Nun übergeben wir diese iterable an enumerate und erstellen ein enumerate-Objekt:

enumerate_object = enumerate(items) # the enumerate object

Wir können das erste Element aus dieser Iterable herausziehen, das wir in einer Schleife mit der next Funktion:

iteration = next(enumerate_object) # first iteration from enumerate
print(iteration)

Und wir sehen, dass wir ein Tupel von 0 der erste Index, und 'a' den ersten Punkt:

(0, 'a')

können wir das so genannte " Reihenfolge Entpacken ", um die Elemente aus diesem Zweiertupel zu extrahieren:

index, item = iteration
#   0,  'a' = (0, 'a') # essentially this.

und wenn wir inspizieren index bezieht sich auf den ersten Index, 0, und item bezieht sich auf den ersten Punkt, 'a' .

>>> print(index)
0
>>> print(item)
a

Schlussfolgerung

  • Python-Indizes beginnen bei Null
  • Um diese Indizes aus einer Iterablen zu erhalten, während Sie darüber iterieren, verwenden Sie die Funktion enumerate
  • Durch die idiomatische Verwendung von enumerate (zusammen mit dem Entpacken von Tupeln) wird der Code lesbarer und wartungsfreundlicher:

Dann tun Sie dies:

for index, item in enumerate(items, start=0):   # Python indexes start at zero
    print(index, item)

4 Stimmen

Ist die " Zählen lassen "Das Beispiel funktioniert, wenn items leer ist?

3 Stimmen

@Bergi: Das wird es nicht, aber Sie können einfach hinzufügen count = 0 vor der Schleife, um sicherzustellen, dass sie einen Wert hat (und zwar den richtigen, wenn die Schleife nie einen Wert zuweist). count da es per Definition keine Gegenstände gab).

0 Stimmen

Das war sehr hilfreich!!

264voto

A.J. Punkte 7461

Es ist ziemlich einfach, es zu starten von 1 andere als 0 :

for index, item in enumerate(iterable, start=1):
   print index, item  # Used to print in python<3.x
   print(index, item) # Mirate print() after 3.x+

17 Stimmen

Die Frage bezog sich auf Listenindizes; da sie bei 0 beginnen, macht es wenig Sinn, von einer anderen Zahl auszugehen, da die Indizes falsch wären (ja, der OP sagte es in der Frage auch falsch). Ansonsten ist der Aufruf der Variablen, die ein Tupel von index, item nur index ist, wie Sie festgestellt haben, sehr irreführend. Verwenden Sie einfach for index, item in enumerate(ints) .

1 Stimmen

Besser ist es, den Index innerhalb von Klammerpaaren als (index) einzuschließen, das funktioniert sowohl in den Python-Versionen 2 und 3.

2 Stimmen

@AnttiHaapala Ich nehme an, der Grund dafür ist, dass die erwartete Ausgabe der Frage bei Index 1 statt bei 0 beginnt.

145voto

Andy Jazz Punkte 34407

Wenn Sie in For-In-Schleifen auf den Index zugreifen, erhalten Sie :

1

items = [8, 23, 45, 12, 78]

for i in enumerate(items):
    print("index/value", i)

Ergebnis:

# index/value (0, 8)
# index/value (1, 23)
# index/value (2, 45)
# index/value (3, 12)
# index/value (4, 78)

2

items = [8, 23, 45, 12, 78]

for i, val in enumerate(items):
    print("index", i, "for value", val)

Ergebnis:

# index 0 for value 8
# index 1 for value 23
# index 2 for value 45
# index 3 for value 12
# index 4 for value 78

3

items = [8, 23, 45, 12, 78]

for i, val in enumerate(items):
    print("index", i)

Ergebnis:

# index 0
# index 1
# index 2
# index 3
# index 4

138voto

David Hanak Punkte 10304
for i in range(len(ints)):
   print(i, ints[i]) # print updated to print() in Python 3.x+

11 Stimmen

Das sollte wohl heißen xrange für vor 3.0.

67 Stimmen

Verwenden Sie stattdessen enumerate

5 Stimmen

Für Python 2.3 und höher sollten Sie die eingebaute Funktion enumerate verwenden, da sie pythonischer ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X