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

Python Syntax
enumerate(iterable, start=0)
Parameter
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

Python Beispiel
colors = ["rot", "grün", "blau"]
for i, color in enumerate(colors):
    print(i, color)
Output
0 rot
1 grün
2 blau

Mit start-Parameter

Python Beispiel
tasks = ["Mails lesen", "Code reviewen", "Doku schreiben"]
for nr, task in enumerate(tasks, start=1):
    print(f"{nr}. {task}")
Output
1. Mails lesen
2. Code reviewen
3. Doku schreiben

Liste in Dictionary umwandeln

Python Beispiel
weekdays = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
index_map = {tag: nr for nr, tag in enumerate(weekdays, 1)}
print(index_map)
Output
{'Mo': 1, 'Di': 2, 'Mi': 3, 'Do': 4, 'Fr': 5, 'Sa': 6, 'So': 7}

Datei zeilenweise mit Zeilennummer lesen

Python Beispiel
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(...))

Python Beispiel
# 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)
Output
0 10
1 20
2 30
0 10
1 20
2 30

Praktische Beispiele

Position aller Treffer in einer Liste finden

Python Beispiel
zeichen = ["a", "b", "c", "b", "d", "b"]
matches = [i for i, x in enumerate(zeichen) if x == "b"]
print(matches)
Output
[1, 3, 5]

Zwei Listen synchron mit Index

Python Beispiel
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")
Output
1. Alice: 42 Punkte
2. Bob: 17 Punkte
3. Charlie: 91 Punkte

Tabellen-Header beim Lesen einer CSV überspringen

Python Beispiel
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 als for 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() und zip(): for i, (a, b) in enumerate(zip(seq1, seq2)): ....
/ Weiter

Zurück zu Builtin Functions

Zur Übersicht