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 tout list()
pour récupérer une liste réelle, donc à partir de 2020, c'est en fait:
list(zip(*original[::-1]))
Voici la répartition:
[::-1]
- fait une copie superficielle de la liste originale dans l'ordre inverse. Pourrait également utiliser reversed()
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 pour zip()
(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 de zip()
en liste.
Donc, en supposant que vous avez ceci:
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
Vous obtenez d'abord ceci (copie inversée superficielle):
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
Ensuite, chacune des sous-listes est passée comme argument à zip
:
zip([7, 8, 9], [4, 5, 6], [1, 2, 3])
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):
[(7, 4, 1),
(8, 5, 2),
(9, 6, 3)]
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 un reversed()
autour du tout. Depuis reversed()
renvoie un itérateur sur la liste, nous devrons mettre list()
autour que pour le convertir. Avec quelques list()
appels supplémentaires pour convertir les itérateurs en une liste réelle. Alors:
rotated = list(reversed(list(zip(*original))))
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érieur list()
:
rotated = list(zip(*original))[::-1]
Bien sûr, vous pouvez également simplement faire pivoter la liste trois fois dans le sens des aiguilles d'une montre. :-)