Saya punya daftar bersarang ini:
l = [['40', '20', '10', '30'], ['20', '20', '20', '20', '20', '30', '20'], ['30', '20', '30', '50', '10', '30', '20', '20', '20'], ['100', '100'], ['100', '100', '100', '100', '100'], ['100', '100', '100', '100']]
Sekarang, yang ingin saya lakukan adalah mengonversi setiap elemen dalam daftar menjadi float. Solusi saya adalah ini:
newList = []
for x in l:
for y in x:
newList.append(float(y))
Tetapi dapatkah ini dilakukan dengan menggunakan pemahaman daftar bersarang, bukan?
apa yang saya lakukan adalah:
[float(y) for y in x for x in l]
Tapi kemudian hasilnya adalah sekelompok 100 dengan jumlah 2400.
solusi apa pun, sebuah penjelasan akan sangat dihargai. Terima kasih!
python
list
nested
list-comprehension
Boy Pasmo
sumber
sumber
Jawaban:
Inilah cara Anda melakukan ini dengan pemahaman daftar bersarang:
Ini akan memberi Anda daftar daftar, mirip dengan apa yang Anda mulai dengan kecuali dengan float, bukan string. Jika Anda menginginkan satu daftar datar maka Anda akan menggunakannya
[float(y) for x in l for y in x]
.sumber
Berikut ini cara mengkonversi nested for loop ke nested listrehension:
Berikut adalah cara kerja pemahaman daftar bersarang:
Untuk kasus Anda, itu akan menjadi seperti ini.
sumber
(f(x) for x in l)
tempat baris kedua for-loop ekuivalen di sebelah kiri.sumber
Tidak yakin apa output yang Anda inginkan, tetapi jika Anda menggunakan pemahaman daftar, urutan mengikuti urutan loop bersarang, yang Anda miliki mundur. Jadi saya mendapatkan apa yang saya pikir Anda inginkan:
Prinsipnya adalah: gunakan urutan yang sama yang akan Anda gunakan dalam menuliskannya sebagai bersarang untuk loop.
sumber
Karena saya sedikit terlambat di sini tetapi saya ingin berbagi bagaimana sebenarnya pemahaman daftar bekerja terutama pemahaman daftar bersarang:
sebenarnya sama dengan:
Dan sekarang daftar pemahaman bersarang:
sama dengan;
keluaran:
sumber
Jika Anda tidak menyukai pemahaman daftar bersarang, Anda dapat menggunakan fungsi peta juga,
sumber
>>> float_l = [map(float, nested_list) for nested_list in l]
[[<map at 0x47be9b0>], [<map at 0x47be2e8>], [<map at 0x47be4a8>], [<map at 0x47beeb8>], [<map at 0x484b048>], [<map at 0x484b0b8>]]
tetapi menambahkan panggilan tambahan ke daftar berfungsi seperti yang diharapkan:>>> float_l = [list(map(float, nested_list)) for nested_list in l]
python3
untuk mengembalikan generator keluar dari pemahaman.Saya memiliki masalah yang sama untuk dipecahkan sehingga saya menemukan pertanyaan ini. Saya melakukan perbandingan kinerja jawaban Andrew Clark dan narayan yang ingin saya bagikan.
Perbedaan utama antara dua jawaban adalah bagaimana mereka mengulangi daftar dalam. Salah satunya menggunakan peta builtin , sementara yang lain menggunakan daftar pemahaman. Fungsi peta memiliki sedikit keunggulan kinerja untuk pemahaman daftar yang setara jika tidak memerlukan penggunaan lambdas . Jadi dalam konteks pertanyaan ini
map
harus melakukan sedikit lebih baik daripada pemahaman daftar.Mari kita lakukan tolok ukur kinerja untuk melihat apakah itu benar. Saya menggunakan python versi 3.5.0 untuk melakukan semua tes ini. Pada set pertama pengujian saya ingin mempertahankan elemen per daftar menjadi 10 dan memvariasikan jumlah daftar dari 10-100.000
Pada set tes berikutnya saya ingin meningkatkan jumlah elemen per daftar menjadi 100 .
Mari kita mengambil langkah berani dan memodifikasi jumlah elemen dalam daftar menjadi 1000
Dari tes ini kita dapat menyimpulkan bahwa
map
memiliki manfaat kinerja melebihi pemahaman daftar dalam hal ini. Ini juga berlaku jika Anda mencoba melakukan cast ke salah satuint
ataustr
. Untuk sejumlah kecil daftar dengan lebih sedikit elemen per daftar, perbedaannya dapat diabaikan. Untuk daftar yang lebih besar dengan lebih banyak elemen per daftar orang mungkin ingin menggunakanmap
alih-alih pemahaman daftar, tetapi itu benar-benar tergantung pada kebutuhan aplikasi.Namun saya pribadi menemukan pemahaman daftar lebih mudah dibaca dan idiomatis daripada
map
. Ini adalah standar de-facto dalam python. Biasanya orang lebih mahir dan nyaman (khususnya pemula) dalam menggunakan pemahaman daftar daripadamap
.sumber
Ya, Anda bisa melakukannya dengan kode seperti itu:
sumber
[float(y) for y in x for x in l]
ini akan menghasilkan sekelompok 100-an dengan jumlah 2400.Masalah ini dapat diselesaikan tanpa menggunakan untuk loop. Kode baris tunggal akan cukup untuk ini. Menggunakan Nested Map dengan fungsi lambda juga akan berfungsi di sini.
Dan Daftar Keluaran adalah sebagai berikut:
sumber
Cara terbaik untuk melakukan ini menurut saya adalah dengan menggunakan
itertools
paket python .sumber
Ya, Anda dapat melakukan hal berikut.
sumber
Ini dapat dicapai dengan menggunakan pemahaman daftar:
sumber