Это умно.
Во-первых, как указано в комментарии, в 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]
Конечно, вы также можете просто повернуть список по часовой стрелке три раза. :-)