Mari kita ambil:
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Hasil yang saya cari adalah
r = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
dan tidak
r = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
Sangat dihargai
Bagaimana tentang
map(list, zip(*l))
--> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Untuk python 3.x pengguna dapat menggunakan
list(map(list, zip(*l)))
Penjelasan:
Ada dua hal yang perlu kita ketahui untuk memahami apa yang terjadi:
zip(*iterables)
Ini berarti zip
mengharapkan sejumlah argumen yang sewenang-wenang yang masing-masing harus dapat diubah. Misalnya zip([1, 2], [3, 4], [5, 6])
.args
, f(*args)
akan memanggil f
sedemikian rupa sehingga setiap elemen dalam args
adalah argumen posisi terpisah f
.Kembali ke input dari pertanyaan l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
, zip(*l)
akan setara dengan zip([1, 2, 3], [4, 5, 6], [7, 8, 9])
. Sisanya hanya memastikan hasilnya adalah daftar daftar bukan daftar tupel.
l
ukurannya tidak merata (katakanlah, beberapa baris lebih pendek dari yang lain), tidakzip
akan mengompensasi dan malah memotong baris dari output. Jadi memberimu .l=[[1,2],[3,4],[5]]
[[1,3,5]]
itertools
fungsizip_longest()
bekerja dengan daftar yang tidak rata. Lihat DOCSlist(zip(*l))
berfungsi dengan benar dalam Python 3.zip(*l)
dalam Python 2), tetapi Anda mendapatkan daftar tupel, bukan daftar daftar. Tentu saja,list(list(it))
selalu sama denganlist(it)
.Salah satu cara untuk melakukannya adalah dengan transpos NumPy. Untuk daftar, a:
Atau yang lain tanpa zip:
sumber
map
bisa melakukan itu. Berikut adalah penyempurnaan sedikit yang tidak memerlukan 2 panggilan, meskipun:map(lambda *a: list(a), *l)
map(None, ...)
sepertinya tidak berfungsi untuk Py3. Generator dibuat tetapinext()
menimbulkan kesalahan segera:TypeError: 'NoneType' object is not callable
.Setara dengan solusi Jena:
sumber
map()
, solusi ini adalah salah satu yang paling dalam semangat Python ...hanya untuk bersenang-senang, persegi panjang yang valid dan dengan asumsi bahwa m [0] ada
sumber
[[j[i] for j in l] for i in range(len(l[0]))]
. Tentu saja, Anda harus yakin daftarl
itu tidak kosong.Metode 1 dan 2 bekerja di Python 2 atau 3, dan mereka bekerja pada daftar 2D persegi panjang yang kasar . Itu berarti daftar dalam tidak perlu memiliki panjang yang sama satu sama lain (compang-camping) atau sebagai daftar luar (persegi panjang). Metode lain, yah, itu rumit.
pengaturan
metode 1 -
map()
,zip_longest()
six.moves.zip_longest()
menjadiitertools.izip_longest()
dalam Python 2itertools.zip_longest()
dalam Python 3Nilai pengisian default adalah
None
. Terima kasih atas jawaban @ jena , di manamap()
mengubah inner tuple menjadi daftar. Ini dia mengubah iterator menjadi daftar. Terima kasih atas komentar @ Oregano dan @ badp .Dalam Python 3, lewati hasilnya
list()
untuk mendapatkan daftar 2D yang sama dengan metode 2.metode 2 - daftar pemahaman,
zip_longest()
The @ inspectorG4dget alternatif .
metode 3 -
map()
ofmap()
- broken dengan Python 3.6Alternatif kedua @SiggyF yang luar biasa kompak ini bekerja dengan daftar 2D yang tidak rata, tidak seperti kode pertamanya yang menggunakan numpy untuk mentranspos dan melewati daftar yang tidak rata. Tapi Tidak ada yang harus menjadi nilai isi. (Tidak, Tidak ada yang diteruskan ke peta bagian dalam () bukan nilai isi. Ini berarti tidak ada fungsi untuk memproses setiap kolom. Kolom hanya diteruskan ke peta luar () yang mengonversinya dari tupel ke daftar.
Di suatu tempat di Python 3,
map()
berhenti memasang dengan semua penyalahgunaan ini: parameter pertama tidak boleh Tidak ada, dan iterator kasar hanya terpotong ke yang terpendek. Metode lain masih berfungsi karena ini hanya berlaku untuk peta bagian dalam ().Metode 4 -
map()
darimap()
ditinjau kembaliSayangnya, baris yang tidak beraturan TIDAK menjadi kolom yang tidak rata dalam Python 3, mereka hanya terpotong. Boo hoo berlangsung.
sumber
Tiga opsi untuk dipilih:
1. Peta dengan Zip
2. Daftar Pemahaman
3. Untuk Tambah Lingkaran
Dan untuk melihat hasilnya:
sumber
Mungkin bukan solusi yang paling elegan, tapi inilah solusi menggunakan nested while loop:
sumber
sumber
more_itertools.unzip()
mudah dibaca, dan juga berfungsi dengan generator.atau setara
sumber
Berikut adalah solusi untuk mentransposisi daftar daftar yang tidak harus kuadrat:
sumber
sumber