Dalam sebuah program saya menulis kebutuhan untuk memutar array dua dimensi muncul. Mencari solusi optimal, saya menemukan satu baris yang mengesankan ini yang melakukan pekerjaan:
rotated = zip(*original[::-1])
Saya menggunakannya di program saya sekarang dan berfungsi sebagaimana mestinya. Masalah saya adalah, saya tidak mengerti cara kerjanya.
Saya akan menghargai jika seseorang dapat menjelaskan bagaimana berbagai fungsi yang terlibat mencapai hasil yang diinginkan.
python
multidimensional-array
paldepind
sumber
sumber
Jawaban:
Perhatikan daftar dua dimensi berikut:
Mari kita uraikan langkah demi langkah:
Daftar ini dilewatkan ke dalam
zip()
menggunakan argumen membongkar , sehinggazip
panggilan berakhir sampai menjadi setara dengan ini:Mudah-mudahan komentar memperjelas apa
zip
fungsinya, itu akan mengelompokkan elemen dari setiap input yang dapat di iterable berdasarkan indeks, atau dengan kata lain mengelompokkan kolom.sumber
rotated = [list(r) for r in zip(*original[::-1])]
Itu sedikit pintar.
Pertama, seperti disebutkan dalam komentar, di Python 3
zip()
mengembalikan sebuah iterator, jadi Anda perlu menyertakan semuanyalist()
untuk mendapatkan daftar yang sebenarnya kembali, jadi pada tahun 2020 itu sebenarnya:Berikut uraiannya:
[::-1]
- membuat salinan dangkal dari daftar asli dengan urutan terbalik. Bisa juga menggunakanreversed()
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 untukzip()
(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 darizip()
menjadi daftar.Jadi dengan asumsi Anda memiliki ini:
Anda pertama kali mendapatkan ini (dangkal, salinan terbalik):
Berikutnya setiap sublist diteruskan sebagai argumen ke
zip
: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):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 melemparreversed()
semuanya. Karenareversed()
mengembalikan iterator di atas daftar, kita perlu meletakkannya dilist()
sekitar itu untuk mengubahnya. Dengan beberapalist()
panggilan tambahan untuk mengubah iterator menjadi daftar sebenarnya. Begitu:Kita dapat menyederhanakannya sedikit dengan menggunakan potongan "Smiley Mars" daripada
reversed()
... maka kita tidak membutuhkan bagian luarnyalist()
:Tentu saja, Anda juga dapat memutar daftar searah jarum jam sebanyak tiga kali. :-)
sumber
zip
ke daftar dengan Python 3.x!Ada tiga bagian untuk ini:
sumber
Hanya observasi. Inputnya adalah daftar daftar, tetapi output dari solusi yang sangat bagus: rotated = zip (* original [:: - 1]) mengembalikan daftar tupel.
Ini mungkin atau mungkin tidak menjadi masalah.
Namun demikian, mudah diperbaiki:
Comp list atau peta keduanya akan mengubah tuple interior kembali ke list.
sumber
sumber
Saya sendiri mengalami masalah ini dan saya telah menemukan halaman wikipedia yang bagus tentang subjek tersebut (di paragraf "Rotasi umum":
https://en.wikipedia.org/wiki/Rotation_matrix#Ambiguities
Kemudian saya menulis kode berikut, super verbose untuk mendapatkan pemahaman yang jelas tentang apa yang sedang terjadi.
Saya harap Anda akan merasakan manfaatnya untuk menggali lebih banyak dalam satu baris yang sangat indah dan cerdas yang Anda posting.
Untuk mengujinya dengan cepat, Anda dapat menyalin / menempelkannya di sini:
http://www.codeskulptor.org/
sumber
Berputar Berlawanan Arah Jarum Jam (kolom standar ke poros baris) Sebagai List dan Dict
Menghasilkan:
sumber
zip(*original[::-1])
kerja.