Це розумний шматочок.
По-перше, як зазначається в коментарі, в Python 3 zip()
повертається ітератор, тому вам потрібно вкласти це все, list()
щоб повернути фактичний список, так що до 2020 року це фактично:
list(zip(*original[::-1]))
Ось поділка:
[::-1]
- робить дрібну копію оригінального списку у зворотному порядку. Можливо також використовувати, reversed()
який створював би зворотний ітератор над списком, а не фактично копіював список (більш ефективний об'єм пам'яті).
*
- робить кожен підпис у вихідному списку окремим аргументом zip()
(тобто розпаковує список)
zip()
- бере один елемент з кожного аргументу і складає список (ну, кортеж) з них і повторюється, поки не будуть вичерпані всі підлісти. Ось де насправді відбувається транспозиція.
list()
перетворює вихідний zip()
список у список.
Тож припускаючи, що у вас це є:
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
Ви спочатку отримуєте це (дрібну, перевернуту копію):
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
Далі кожен із списків передається як аргумент zip
:
zip([7, 8, 9], [4, 5, 6], [1, 2, 3])
zip()
неодноразово споживає один елемент з початку кожного з його аргументів і робить з нього кортеж, поки не буде більше елементів, в результаті чого (після його перетворення в список):
[(7, 4, 1),
(8, 5, 2),
(9, 6, 3)]
А Боб твій дядько.
Щоб відповісти на запитання @ IkeMiguel в коментарі про обертання його в інший бік, це досить просто: вам просто потрібно змінити обидві послідовності, що входять zip
і результат. Першого можна досягти, видаливши, [::-1]
а другого можна досягти, кинувши reversed()
навколо себе всю річ. Оскільки reversed()
повертає ітератор над списком, нам потрібно буде поставити list()
навколо цього, щоб перетворити його. З кількома додатковими list()
дзвінками для перетворення ітераторів у фактичний список. Так:
rotated = list(reversed(list(zip(*original))))
Ми можемо трохи спростити це, використовуючи фрагмент "Марсіанський смайлик", а не reversed()
... тоді зовнішнє нам не потрібно list()
:
rotated = list(zip(*original))[::-1]
Звичайно, ви також можете просто повернути список три рази за годинниковою стрілкою. :-)