Python enumerate für index- und wertpaare

Python enumerate fügt einem Iterable einen laufenden Index hinzu und liefert beim Durchlaufen (Index, Wert)-Paare. Nutze es, wenn du die Position jedes Elements brauchst, etwa für nummerierte Ausgaben oder Labels. Es ist das eingebaute Muster, um jedes Element mit seiner Position in Listen, Generatoren oder Dateizeilen zu verknüpfen.

Python Enumerate-Beispiel Für Nummerierte Ausgabe

Ausgabe:

Die Ausgabe erscheint hier...

Ausgabe:

1. Bestellung versenden
2. Kunden-E-Mail senden

So Funktioniert Dieses Beispiel

  1. enumerate(tasks, start=1) koppelt jede Aufgabe mit ihrer Position.
  2. start=1 macht die Nummern menschenfreundlich.
  3. Die Ausgabe zeigt jede Aufgabe mit ihrer Nummer.

Häufige stolperfallen mit Python enumerate

Fehler 1: Vergessen, dass die Zählung bei 0 beginnt.

for line_no, row in enumerate(rows):
    print(f"Zeile {line_no}: {row['sku']}")
for line_no, row in enumerate(rows, start=1):
    print(f"Zeile {line_no}: {row['sku']}")

Warum das passiert: enumerate startet standardmäßig bei 0, was für Indizes korrekt, für menschenlesbare Zeilennummern aber verwirrend ist.

Fehler 2: Ein Dictionary enumerieren und Werte erwarten.

region_totals = {"west": 1200, "ost": 980}
for i, total in enumerate(region_totals):
    print(i, total)
region_totals = {"west": 1200, "ost": 980}
for i, (region, total) in enumerate(region_totals.items(), start=1):
    print(i, region, total)

Warum das passiert: Beim Iterieren über ein dict erhältst du Schlüssel, daher paart enumerate Indizes mit Schlüsseln, sofern du nicht .items() verwendest. Wenn du Schlüssel/Wert-Muster brauchst, siehe das Python dict-Beispiel.

Fehler 3: list(enumerate(...)) für große Daten bauen.

indexed_rows = list(enumerate(rows, start=1))
for line_no, row in indexed_rows:
    print(line_no, row)
for line_no, row in enumerate(rows, start=1):
    print(line_no, row)

Warum das passiert: list() lädt alle Paare in den Speicher, während enumerate bereits lazy ist und streamen kann.

enumerate vs range(len()): was nutzen?

Nutze enumerate, wenn…Nutze range(len()), wenn…
Du Index und Element zusammen brauchst.Du nur numerische Indizes brauchst.
Du über beliebige Iterables iterierst, auch Generatoren.Du in benutzerdefinierten Schritten springen oder nur per Index iterieren musst.
Du lesbare Schleifen ohne manuelle Indizes möchtest.Du mit Indizes für Slicing oder Random-Access arbeitest.

Faustregel: Greife zu enumerate für Index + Wert; nutze range(len()), wenn der Index selbst das Entscheidende ist. Wenn du nur Index-Mathe brauchst, geht das Python range-Beispiel tiefer.

Performance-Überlegungen

enumerate ist O(n) und lazy, daher erzeugt es keine zusätzliche Paarliste, außer du umhüllst es mit list(). In der Praxis ist es schneller und klarer als list.index() in einer Schleife (was die Schleife O(n^2) machen kann). Wenn du nur Zeilen labeln musst, bleibt enumerate speichersparend und liefert trotzdem Zeilennummern.

Weitere anwendungsfälle für enumerate

Fehlerzeilen beim Log-Scan markieren.

lines = [
    "INFO verbunden",
    "FEHLER Timeout",
    "INFO neuer Versuch",
]

for line_no, line in enumerate(lines, start=1):
    if "FEHLER" in line:
        print(f"Zeile {line_no}: {line}")

So bleibt die exakte Zeilennummer an jedem Fehler hängen, was Debugging und Incident-Review beschleunigt. Das funktioniert auch mit Dateien, weil enumerate jedes Iterable akzeptiert.

Eine Liste per Index in-place normalisieren.

names = ["  ada", "grace ", "  linus"]
for i, name in enumerate(names):
    # per Index aktualisieren, wenn du die Liste in-place mutieren willst
    names[i] = name.strip().title()

print(names)

So bleiben die Daten in derselben Liste, während du den Index zur Rückzuweisung bekommst. Das ist klarer als einen manuellen Zähler zu verwalten und hält die Schleife lesbar.