Hintergrund
Die Funktion zip() wurde in Python als bequeme Möglichkeit eingeführt, mehrere Sequenzen zu "verknüpfen", um Tupel mit entsprechenden Elementen zu erstellen und eine art "Matrix" Struktur zu erhalten.
Problem
Ein Fehler tritt auf, wenn Entwickler zip für Sequenzen unterschiedlicher Länge verwenden und erwarten, dass das Ergebnis die Länge der längsten Sequenz hat, oder die Entpackung beim Rückverwandeln falsch anwenden.
Lösung
zip() akzeptiert eine oder mehrere Sequenzen und gibt einen Iterator von Tupeln zurück, wobei das n-te Tupel die n-ten Elemente aus allen Sequenzen enthält. Die Iteration endet, wenn die kürzeste Sequenz erschöpft ist.
Beispielcode:
names = ['John', 'Anna', 'Peter'] ages = [28, 22, 35] grouped = list(zip(names, ages)) print(grouped) # [('John', 28), ('Anna', 22), ('Peter', 35)]
Wichtige Merkmale:
Was passiert, wenn zip Sequenzen unterschiedlicher Länge übergeben wird?
Das Ergebnis hat die Länge der kürzesten Sequenz. Die anderen Elemente werden ignoriert.
zip([1,2,3], ['a','b']) # [(1,'a'), (2,'b')]
Kann man zip "entpacken"? Wie erhält man die ursprünglichen Sequenzen zurück?
Ja, mit Hilfe von Entpackung und zip(*iterator):
pairs = [(1, "a"), (2, "b")] numbers, letters = zip(*pairs) print(numbers) # (1, 2)
Was unterscheidet zip von itertools.zip_longest?
zip_longest aus itertools arbeitet bis zur längsten Sequenz und füllt Lücken mit dem angegebenen fillvalue.
from itertools import zip_longest zip_longest([1,2], ['a','b','c'], fillvalue=None) # [(1,'a'), (2,'b'), (None, 'c')]
Wir haben Benutzer und Passwörter über zip verarbeitet, aber die Listen hatten unterschiedliche Längen. Einige Benutzer wurden aufgrund der Verarbeitung von zip mit der kurzen Liste nicht berücksichtigt.
Vorteile:
Nachteile:
Zur Kombination von Testergebnissen und Studentennamen haben wir zip_longest mit fillvalue="n/a" verwendet, um die Daten aller Teilnehmer zu bewahren.
Vorteile:
Nachteile: