Dans un programme que j'écris, la nécessité de faire pivoter un tableau à deux dimensions est apparue. À la recherche de la solution optimale, j'ai trouvé cet impressionnant monocouche qui fait le travail:
rotated = zip(*original[::-1])
Je l'utilise maintenant dans mon programme et cela fonctionne comme prévu. Mon problème cependant, c'est que je ne comprends pas comment cela fonctionne.
J'apprécierais que quelqu'un puisse expliquer comment les différentes fonctions impliquées atteignent le résultat souhaité.
python
multidimensional-array
paldepind
la source
la source
Réponses:
Considérez la liste bidimensionnelle suivante:
Permet de le décomposer étape par étape:
Cette liste est passée en
zip()
utilisant le déballage d'arguments , donc l'zip
appel finit par être l'équivalent de ceci:Espérons que les commentaires clarifient ce que
zip
fait, il regroupera les éléments de chaque entrée itérable en fonction de l'index, ou en d'autres termes, il regroupe les colonnes.la source
rotated = [list(r) for r in zip(*original[::-1])]
C'est un peu intelligent.
Premièrement, comme indiqué dans un commentaire, dans Python 3
zip()
renvoie un itérateur, vous devez donc inclure le toutlist()
pour récupérer une liste réelle, donc à partir de 2020, c'est en fait:Voici la répartition:
[::-1]
- fait une copie superficielle de la liste originale dans l'ordre inverse. Pourrait également utiliserreversed()
qui produirait un itérateur inversé sur la liste plutôt que de copier réellement la liste (plus efficace en mémoire).*
- fait de chaque sous-liste de la liste d'origine un argument distinct pourzip()
(c'est- à -dire décompresse la liste)zip()
- prend un élément de chaque argument et fait une liste (enfin, un tuple) de ceux-ci, et se répète jusqu'à ce que toutes les sous-listes soient épuisées. C'est là que la transposition se produit réellement.list()
convertit la sortie dezip()
en liste.Donc, en supposant que vous avez ceci:
Vous obtenez d'abord ceci (copie inversée superficielle):
Ensuite, chacune des sous-listes est passée comme argument à
zip
:zip()
consomme à plusieurs reprises un élément depuis le début de chacun de ses arguments et en fait un tuple, jusqu'à ce qu'il n'y ait plus d'éléments, ce qui entraîne (après sa conversion en liste):Et Bob est ton oncle.
Pour répondre à la question de @ IkeMiguel dans un commentaire sur la rotation dans l'autre sens, c'est assez simple: il vous suffit d'inverser à la fois les séquences qui entrent
zip
et le résultat. Le premier peut être réalisé en supprimant le[::-1]
et le second peut être réalisé en lançant unreversed()
autour du tout. Depuisreversed()
renvoie un itérateur sur la liste, nous devrons mettrelist()
autour que pour le convertir. Avec quelqueslist()
appels supplémentaires pour convertir les itérateurs en une liste réelle. Alors:Nous pouvons simplifier un peu cela en utilisant la tranche "Smiley Martien" plutôt que
reversed()
... alors nous n'avons pas besoin de l'extérieurlist()
:Bien sûr, vous pouvez également simplement faire pivoter la liste trois fois dans le sens des aiguilles d'une montre. :-)
la source
zip
en une liste en Python 3.x!Il y a trois parties à cela:
la source
Juste une observation. L'entrée est une liste de listes, mais la sortie de la très belle solution: rotated = zip (* original [:: - 1]) renvoie une liste de tuples.
Cela peut ou non être un problème.
Il est cependant facilement corrigé:
La composition de liste ou la carte convertira les tuples intérieurs en listes.
la source
la source
J'ai moi-même eu ce problème et j'ai trouvé la super page wikipedia sur le sujet (dans le paragraphe "Rotations communes":
https://en.wikipedia.org/wiki/Rotation_matrix#Ambiguities
Ensuite, j'ai écrit le code suivant, super verbeux afin d'avoir une compréhension claire de ce qui se passe.
J'espère que vous trouverez utile de creuser davantage dans le très beau et intelligent one-liner que vous avez publié.
Pour le tester rapidement, vous pouvez le copier / coller ici:
http://www.codeskulptor.org/
la source
Rotation dans le sens inverse des aiguilles d'une montre (pivot de colonne à ligne standard) comme liste et dictée
Produit:
la source
zip(*original[::-1])
fonctionnement.