Itu sedikit pintar.
Pertama, seperti disebutkan dalam komentar, di Python 3 zip()
mengembalikan sebuah iterator, jadi Anda perlu menyertakan semuanya list()
untuk mendapatkan daftar yang sebenarnya kembali, jadi pada tahun 2020 itu sebenarnya:
list(zip(*original[::-1]))
Berikut uraiannya:
[::-1]
- membuat salinan dangkal dari daftar asli dengan urutan terbalik. Bisa juga menggunakan reversed()
yang akan menghasilkan iterator terbalik di atas daftar daripada benar-benar menyalin daftar (lebih efisien memori).
*
- membuat setiap sublist dalam daftar asli menjadi argumen terpisah untuk zip()
(yaitu, membongkar daftar)
zip()
- mengambil satu item dari setiap argumen dan membuat daftar (yah, tuple) dari itu, dan mengulangi sampai semua sublist habis. Di sinilah transposisi sebenarnya terjadi.
list()
mengonversi keluaran dari zip()
menjadi daftar.
Jadi dengan asumsi Anda memiliki ini:
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
Anda pertama kali mendapatkan ini (dangkal, salinan terbalik):
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
Berikutnya setiap sublist diteruskan sebagai argumen ke zip
:
zip([7, 8, 9], [4, 5, 6], [1, 2, 3])
zip()
berulang kali mengkonsumsi satu item dari awal setiap argumennya dan membuat tupel darinya, hingga tidak ada lagi item, menghasilkan (setelah itu diubah menjadi daftar):
[(7, 4, 1),
(8, 5, 2),
(9, 6, 3)]
Dan Bob adalah pamanmu.
Untuk menjawab pertanyaan @ IkeMiguel dalam komentar tentang memutarnya ke arah lain, cukup mudah: Anda hanya perlu membalik urutan yang masuk zip
dan hasilnya. Yang pertama dapat dicapai dengan membuang [::-1]
yang kedua dan yang kedua dapat dicapai dengan melempar reversed()
semuanya. Karena reversed()
mengembalikan iterator di atas daftar, kita perlu meletakkannya di list()
sekitar itu untuk mengubahnya. Dengan beberapa list()
panggilan tambahan untuk mengubah iterator menjadi daftar sebenarnya. Begitu:
rotated = list(reversed(list(zip(*original))))
Kita dapat menyederhanakannya sedikit dengan menggunakan potongan "Smiley Mars" daripada reversed()
... maka kita tidak membutuhkan bagian luarnya list()
:
rotated = list(zip(*original))[::-1]
Tentu saja, Anda juga dapat memutar daftar searah jarum jam sebanyak tiga kali. :-)