HOWTO · Python

Eine Tupelliste aus mehreren Listen und Tupeln in Python erstellen

Erfahren Sie, wie Sie in Python eine Tupelliste aus mehreren Listen und Tupeln erstellen

Auf dieser Seite

Verwenden Sie list(zip(values_a, values_b, ...)), um Werte an derselben Position zu paaren und das Ergebnis als Tupelliste zu materialisieren. Die eingebaute Funktion zip() akzeptiert Listen, Tupel und andere Iterables und ist daher meist die klarste Möglichkeit, entsprechende Werte in Python zu kombinieren.

Dieser Artikel verwendet Python 3.14.7 und behandelt gleich lange Eingaben, das Standardverhalten bei unterschiedlichen Längen, strikte Validierung und das Beibehalten jeder Zeile, wenn eine Eingabe länger ist.

Was zip() zurückgibt

Jedes von zip() erzeugte Element ist ein Tupel mit einem Wert aus jeder Eingabe. Das zip-Objekt ist lazy: Es erzeugt Tupel beim Iterieren, statt das vollständige Ergebnis zu speichern. Verwenden Sie list(), wenn die Aufgabe eine materialisierte, druckbare, indexierbare oder wiederverwendbare Tupelliste erfordert.

Die Eingaben können aus einer Mischung von Listen und Tupeln bestehen. Die Paarung erfolgt positionsbezogen: Zuerst werden die ersten Werte, dann die zweiten Werte usw. kombiniert. Die Tupellänge entspricht der Anzahl der Eingabe-Iterables.

Eine Tupelliste aus gleich langen Eingaben erstellen

Das folgende Beispiel kombiniert eine Zahlenliste mit einem Buchstabentupel. list(zip(...)) verbraucht den lazy Iterator und gibt die gewünschte Tupelliste zurück.

values = list(zip([1, 2, 3], ("a", "b", "c")))
print(values)

Ausgabe:

[(1, 'a'), (2, 'b'), (3, 'c')]

Bei gleich langen Eingaben enthält das Ergebnis ein Tupel pro Position. Dafür ist kein Paket eines Drittanbieters nötig, und die Ausgabeliste benötigt Speicher proportional zur Anzahl der erzeugten Tupel. Wenn Sie nur einmal iterieren müssen, behalten Sie das lazy zip-Objekt, statt es zu materialisieren.

Ungleich lange Eingaben behandeln

Standardmäßig stoppt zip(), sobald die kürzeste Eingabe erschöpft ist. Das ist praktisch, wenn zusätzliche Werte ignoriert werden sollen, kann aber fehlende Daten verbergen, wenn alle Eingaben gleich lang sein müssen. Verwenden Sie strict=True, wenn gleiche Längen eine Invariante sind. Python löst dann ValueError aus, sobald eine Eingabe kürzer oder länger ist.

try:
    list(zip([1, 2, 3], ("a", "b"), strict=True))
except ValueError as error:
    print(type(error).__name__, str(error))

Ausgabe:

ValueError zip() argument 2 is shorter than argument 1

Die Option strict=True ist ab Python 3.10 verfügbar. Sie eignet sich für Datensätze, die ausgerichtet bleiben müssen; behandeln Sie den ValueError oder validieren Sie die Eingaben vorher.

Jede Eingabezeile mit itertools.zip_longest() behalten

Wenn das Ergebnis Positionen der längsten Eingabe enthalten muss, verwenden Sie statt des Standard-zip() itertools.zip_longest(). Fehlende Positionen werden mit None gefüllt, sofern kein fillvalue angegeben wird. Wählen Sie einen Sentinel, der nicht mit einem echten Wert verwechselt werden kann.

Beispielsweise behält list(itertools.zip_longest(first, second, fillvalue="missing")) alle Positionen und kennzeichnet den fehlenden Wert als "missing". Das ist die richtige Randbehandlung, wenn das Abschneiden an der kürzesten Eingabe eine Zeile verwerfen würde.

Die Liste manuell erstellen, wenn Sie explizite Kontrolle benötigen

Die manuelle Indexmethode ist nützlich, wenn Eingaben ausdrücklich als list- oder tuple-Objekte validiert werden müssen oder eigene Regeln neben der Paarungslogik stehen. Der ausführbare Fallback convert = lambda *args: [] if not all(isinstance(value, (list, tuple)) for value in args) else [tuple(value[index] for value in args) for index in range(min((len(value) for value in args), default=0))] bewahrt die Validierung und stoppt bei der kürzesten Eingabe. Für die vier Beispielwerte gibt er [(1.1, 'H', True, 100), (2.2, 'E', False, 200), (3.3, 'L', False, 300)] zurück.

Die Funktion lehnt ein Argument ab, dessen Typ weder list noch tuple ist, und stoppt dann bei der kürzesten Eingabe. Mit m als kürzester Länge und n als Anzahl der Eingaben benötigt sie O(m * n) Zeit und O(m * n) Speicher für das materialisierte Ergebnis.

Die passende Methode auswählen

Verwenden Sie list(zip(...)) für gewöhnliche positionsbezogene Paarungen und ein materialisiertes Ergebnis. Verwenden Sie lazy zip() für eine einmalige Iteration. Nutzen Sie strict=True, wenn unterschiedliche Längen ungültige Daten bedeuten, und itertools.zip_longest() mit einem expliziten Füllwert, wenn keine Eingabezeile verloren gehen darf. Die manuelle Methode ist ein Fallback für eigene Validierungs- oder Indexierungsregeln.