(x, y) == tuple(zip(*zip(x,y))) ist genau dann wahr, wenn die beiden folgenden Aussagen wahr sind:
xund yhaben die gleiche Länge
xund ysind Tupel
Ein guter Weg, um zu verstehen, was los ist, ist das Drucken bei jedem Schritt:
x = [1, 2, 3]
y = ["a", "b", "c", "d"]
print("1) x, y = ", x, y)
print("2) zip(x, y) = ", list(zip(x, y)))
print("3) *zip(x, y) = ", *zip(x, y))
print("4) zip(*zip(x,y)) = ", list(zip(*zip(x,y))))
Welche Ausgänge:
1) x, y = [1, 2, 3] ['a', 'b', 'c', 'd']
2) zip(x, y) = [(1, 'a'), (2, 'b'), (3, 'c')]
3) *zip(x, y) = (1, 'a') (2, 'b') (3, 'c')
4) zip(*zip(x,y)) = [(1, 2, 3), ('a', 'b', 'c')]
Grundsätzlich passiert Folgendes:
- Elemente aus
xund ywerden entsprechend ihren jeweiligen Indizes gepaart.
- Paare werden zu 3 verschiedenen Objekten (Tupeln) ausgepackt
- Paare werden an zip übergeben, wodurch wiederum alle Elemente anhand von Indizes gepaart werden:
- Die ersten Elemente aller Eingaben werden gepaart:
(1, 2, 3)
- zweite Elemente von allen Eingaben werden gepaart:
('a', 'b', 'c')
Jetzt können Sie verstehen, warum (x, y) == tuple(zip(*zip(x,y)))in diesem Fall falsch ist:
- Da
yes länger als ist x, hat der erste Zip-Vorgang das zusätzliche Element entfernt y(da es nicht gekoppelt werden konnte), wird diese Änderung offensichtlich beim zweiten Zip-Vorgang erneut ausgeführt
- Typen unterscheiden sich, am Anfang hatten wir zwei Listen, jetzt haben wir zwei Tupel, ebenso
zipwie Paarelemente in Tupeln und nicht in Listen
Wenn Sie nicht 100% sicher sind, wie es zipfunktioniert, habe ich hier eine Antwort auf diese Frage geschrieben: Entpacken und der Operator *