In einem Programm, das ich schreibe, kam die Notwendigkeit auf, ein zweidimensionales Array zu drehen. Auf der Suche nach der optimalen Lösung habe ich diesen beeindruckenden Einzeiler gefunden, der die Aufgabe erfüllt:
rotated = zip(*original[::-1])
Ich benutze es jetzt in meinem Programm und es funktioniert wie angenommen. Mein Problem ist jedoch, dass ich nicht verstehe, wie es funktioniert.
Ich würde mich freuen, wenn jemand erklären könnte, wie die verschiedenen beteiligten Funktionen das gewünschte Ergebnis erzielen.
python
multidimensional-array
Paldepind
quelle
quelle
Antworten:
Betrachten Sie die folgende zweidimensionale Liste:
Lassen Sie es uns Schritt für Schritt aufschlüsseln:
Diese Liste wird an das Entpacken
zip()
von Argumenten übergeben , sodass derzip
Aufruf dem entspricht:Hoffentlich machen die Kommentare deutlich, was zu
zip
tun ist. Sie gruppieren Elemente aus jeder Eingabe iterabel basierend auf dem Index, oder mit anderen Worten, sie gruppieren die Spalten.quelle
rotated = [list(r) for r in zip(*original[::-1])]
Das ist ein kluges Stück.
Wie in einem Kommentar erwähnt, gibt Python 3 zunächst
zip()
einen Iterator zurück. Sie müssen also das Ganze einschließenlist()
, um eine aktuelle Liste wieder herauszubekommen. Ab 2020 ist es also tatsächlich:Hier ist die Aufschlüsselung:
[::-1]
- erstellt eine flache Kopie der Originalliste in umgekehrter Reihenfolge. Könnte auch verwenden,reversed()
was einen umgekehrten Iterator über die Liste erzeugen würde, anstatt die Liste tatsächlich zu kopieren (speichereffizienter).*
- macht jede Unterliste in der ursprünglichen Liste zu einem separaten Argumentzip()
(dh entpackt die Liste)zip()
- nimmt aus jedem Argument einen Punkt und erstellt daraus eine Liste (also ein Tupel) und wiederholt diese, bis alle Unterlisten erschöpft sind. Hier findet die Umsetzung tatsächlich statt.list()
konvertiert die Ausgabe vonzip()
in eine Liste.Angenommen, Sie haben Folgendes:
Sie erhalten zuerst diese (flache, umgekehrte Kopie):
Als nächstes wird jede der Unterlisten als Argument übergeben an
zip
:zip()
verbraucht wiederholt ein Element vom Anfang jedes seiner Argumente und erstellt daraus ein Tupel, bis keine Elemente mehr vorhanden sind. Dies führt dazu (nachdem es in eine Liste konvertiert wurde):Und Bob ist dein Onkel.
Um die Frage von @ IkeMiguel in einem Kommentar zum Drehen in die andere Richtung zu beantworten, ist es ziemlich einfach: Sie müssen nur die Sequenzen
zip
und das Ergebnis umkehren . Das erste kann durch Entfernen des[::-1]
und das zweite durch Umwerfenreversed()
des Ganzen erreicht werden. Dareversed()
gibt einen Iterator über die Liste, müssen wir setzenlist()
um , dass es zu konvertieren. Mit ein paar zusätzlichenlist()
Aufrufen, um die Iteratoren in eine tatsächliche Liste umzuwandeln. So:Wir können das ein wenig vereinfachen, indem
reversed()
wir das "Martian Smiley" -Scheck verwenden, anstatt ... dann brauchen wir das Äußere nichtlist()
:Natürlich können Sie die Liste auch einfach dreimal im Uhrzeigersinn drehen. :-)
quelle
zip
in eine Liste in Python 3.x umwandeln müssen!Das besteht aus drei Teilen:
quelle
Nur eine Beobachtung. Die Eingabe ist eine Liste von Listen, aber die Ausgabe der sehr schönen Lösung: gedreht = zip (* original [:: - 1]) gibt eine Liste von Tupeln zurück.
Dies kann ein Problem sein oder auch nicht.
Es ist jedoch leicht zu korrigieren:
Die Listenkomposition oder die Karte konvertieren beide die inneren Tupel zurück in Listen.
quelle
quelle
Ich hatte dieses Problem selbst und habe die großartige Wikipedia-Seite zu diesem Thema gefunden (im Abschnitt "Allgemeine Rotationen":
https://en.wikipedia.org/wiki/Rotation_matrix#Ambiguities
Dann habe ich den folgenden Code geschrieben, super ausführlich, um ein klares Verständnis dafür zu haben, was los ist.
Ich hoffe, dass Sie es nützlich finden, mehr in dem sehr schönen und cleveren Einzeiler zu graben, den Sie gepostet haben.
Um es schnell zu testen, können Sie es hier kopieren / einfügen:
http://www.codeskulptor.org/
quelle
Gegen den Uhrzeigersinn drehen (Standard-Drehpunkt zwischen Spalte und Zeile) Als Liste und Diktat
Produziert:
quelle
zip(*original[::-1])
erfordert.