Die Python-Funktion enumerate() legt sich um ein beliebiges Iterable und liefert bei jeder Iteration ein Tupel (index, element). Sie ersetzt die in Python unidiomatische Konstruktion for i in range(len(seq)): seq[i] und ist die Standard-Idiom-Wahl, wenn man sowohl Position als auch Wert in einer Schleife benötigt. Optional lässt sich der Startindex über start festlegen.
Einleitung
In vielen Programmiersprachen iteriert man mit einer Zählvariable. Python bietet mit for x in iterable zwar einen sauberen Iterator-Zugriff — aber wenn der Index gebraucht wird, ist enumerate() die richtige Wahl. Sie ist lazy, d. h. erzeugt die Index-Element-Paare on-the-fly und arbeitet damit auch mit sehr großen oder unendlichen Iterables effizient.
Syntax
enumerate(iterable, start=0)iterable Eine beliebige Iterable: Liste, Tupel, String, Datei, Generator, Set usw.
start (Optional, Default 0) Wert, ab dem die Indizes gezählt werden. Häufig 1 für menschlich lesbare Nummerierungen.
Rückgabewert
Ein enumerate-Iterator, der bei jeder Iteration ein Tupel (index, element) liefert. Lazy — verbraucht keinen Speicher für alle Paare auf einmal.
Beispiele
Standard-Verwendung
colors = ["rot", "grün", "blau"]
for i, color in enumerate(colors):
print(i, color)0 rot
1 grün
2 blauMit start-Parameter
tasks = ["Mails lesen", "Code reviewen", "Doku schreiben"]
for nr, task in enumerate(tasks, start=1):
print(f"{nr}. {task}")1. Mails lesen
2. Code reviewen
3. Doku schreibenListe in Dictionary umwandeln
weekdays = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
index_map = {tag: nr for nr, tag in enumerate(weekdays, 1)}
print(index_map){'Mo': 1, 'Di': 2, 'Mi': 3, 'Do': 4, 'Fr': 5, 'Sa': 6, 'So': 7}Datei zeilenweise mit Zeilennummer lesen
with open("logfile.txt") as f:
for nr, line in enumerate(f, 1):
if "ERROR" in line:
print(f"Zeile {nr}: {line.rstrip()}")Werte indexieren statt range(len(...))
# Unidiomatisch (aus anderen Sprachen):
nums = [10, 20, 30]
for i in range(len(nums)):
print(i, nums[i])
# Idiomatisch in Python:
for i, n in enumerate(nums):
print(i, n)0 10
1 20
2 30
0 10
1 20
2 30Praktische Beispiele
Position aller Treffer in einer Liste finden
zeichen = ["a", "b", "c", "b", "d", "b"]
matches = [i for i, x in enumerate(zeichen) if x == "b"]
print(matches)[1, 3, 5]Zwei Listen synchron mit Index
names = ["Alice", "Bob", "Charlie"]
punkte = [42, 17, 91]
for nr, (name, pkt) in enumerate(zip(names, punkte), start=1):
print(f"{nr}. {name}: {pkt} Punkte")1. Alice: 42 Punkte
2. Bob: 17 Punkte
3. Charlie: 91 PunkteTabellen-Header beim Lesen einer CSV überspringen
import csv
with open("data.csv") as f:
reader = csv.reader(f)
for nr, row in enumerate(reader):
if nr == 0:
continue # Header überspringen
print(nr, row)Praktische Hinweise
- Idiomatisch in Python:
for i, x in enumerate(seq)ist immer besser alsfor i in range(len(seq)). - Lazy: Funktioniert auch mit Generatoren, Datei-Streams und unendlichen Iterables.
- start ist nur ein Offset — die Iteration über die Sequenz beginnt trotzdem beim ersten Element.
- Soll man mehrere Sequenzen parallel mit Index iterieren, kombiniert man
enumerate()undzip():for i, (a, b) in enumerate(zip(seq1, seq2)): ....