Wie funktioniert das Code-Snippet, das eine Matrix rotiert?

8

Bei der Suche nach einer pythischen Methode, eine Matrix zu drehen, stieß ich auf diese Antwort. Es gibt jedoch keine Erklärung dafür. Ich habe das Snippet hier kopiert:

%Vor%

Wie funktioniert es?

    
Tamás Szelei 18.06.2013, 08:47
quelle

3 Antworten

5
%Vor%

[::-1] kehrt die Liste um:

%Vor%

Jetzt verwenden wir zip für alle Elemente der rev und hängen jedes zurückgegebene Tupel an rotiert an:

%Vor%

zip wählt Elemente aus demselben Index von jedem iterablen Element aus (es wird nur bis zum Element mit minimaler Länge ausgeführt) und gibt sie als Tupel zurück.

Was ist * :

* wird zum Entpacken aller Elemente von rev in zip verwendet, also anstatt manuell zu tippen rev[0], rev[1], rev[2] , wir können einfach zip(*rev) machen.

Die obige zip -Schleife könnte auch geschrieben werden als:

%Vor%     
Ashwini Chaudhary 18.06.2013, 08:53
quelle
5

Komplementär zu den Erklärungen von Ashwini und HennyH, hier ist eine kleine Figur, um den Prozess zu veranschaulichen.

  1. Zunächst kehrt der Operator [::-1] slice die Liste der Liste um, wobei die gesamte Liste (also die ersten zwei Argumente können weggelassen werden) und der Schritt -1 .
  2. verwendet wird
  3. Zweitens nimmt die Funktion zip eine Anzahl von Listen und gibt eine neue Liste mit umgekehrten Zeilen und Spalten zurück. Der * sagt, dass die Liste der Listen in mehrere Listen entpackt ist.

Wie zu sehen ist, werden diese beiden Operationen zusammen die Matrix drehen.

    
tobias_k 18.06.2013 09:29
quelle
2

Für meine Erkundung:

%Vor%

Was wäre, wenn hübsch gedruckt wäre:

%Vor%

Zunächst erstellt zip(*m) eine Liste aller Spalten in m . Wie demonstriert durch:

%Vor%

Wie das funktioniert, ist zip nimmt n Sequenzen und erhält das i-th -Element von jedem und fügt es einem Tupel hinzu. So übersetzt in unsere Matrix m , wobei jede Zeile durch eine Liste innerhalb von m dargestellt wird, übergeben wir im Wesentlichen jede Zeile an zip , die dann das erste Element aus jeder Reihe puts erhält Alle von ihnen in ein Tupel, dann wird jedes zweite Element aus jeder Zeile etc ... Letztendlich bekommen alle Spalte in m ie:

%Vor%

Das würde jetzt so aussehen:

%Vor%

Somit ist jede -Spalte in m jetzt eine Zeile . Aber es ist nicht in der richtigen Reihenfolge (versuchen Sie, sich vorzustellen, in Ihrem Kopf drehen m , um die Matrix oben zu bekommen, kann es nicht getan werden). Deshalb ist es notwendig, die ursprüngliche Matrix umzudrehen:

%Vor%

Was zu einer Matrix führt, die das Äquivalent von m rotiert - 90 Grad.

    
HennyH 18.06.2013 09:02
quelle

Tags und Links