Dalam Python, Anda dapat memiliki beberapa iterator dalam pemahaman daftar, seperti
[(x,y) for x in a for y in b]
untuk beberapa urutan yang sesuai a dan b. Saya menyadari semantik loop bersarang dari pemahaman daftar Python.
Pertanyaan saya adalah: Bisakah satu iterator dalam pemahaman merujuk ke yang lain? Dengan kata lain: Dapatkah saya memiliki sesuatu seperti ini:
[x for x in a for a in b]
di mana nilai saat ini dari loop luar adalah iterator bagian dalam?
Sebagai contoh, jika saya memiliki daftar bersarang:
a=[[1,2],[3,4]]
seperti apa ekspresi pemahaman daftar untuk mencapai hasil ini:
[1,2,3,4]
?? (Tolong cantumkan jawaban pemahaman saja, karena ini yang ingin saya ketahui).
sumber
[x for b in a for x in b]
Ini selalu disadap tentang python. Sintaks ini sangat mundur. Bentuk umumx for x in y
selalu memiliki variabel langsung setelah untuk, diumpankan ke ekspresi di sebelah kiri untuk. Segera setelah Anda melakukan pemahaman ganda, variabel iterated terakhir Anda tiba-tiba begitu "jauh". Ini aneh, dan tidak membaca sama sekaliSaya harap ini membantu orang lain karena
a,b,x,y
tidak ada artinya bagi saya! Misalkan Anda memiliki teks yang penuh dengan kalimat dan Anda ingin berbagai kata.Saya suka menganggap daftar pemahaman sebagai peregangan kode secara horizontal.
Coba pisahkan menjadi:
Contoh:
Ini juga berfungsi untuk generator
sumber
Wah, saya kira saya menemukan anwser: Saya tidak cukup peduli tentang loop mana yang dalam dan mana yang luar. Pemahaman daftar harus seperti:
untuk mendapatkan hasil yang diinginkan, dan ya, satu nilai saat ini dapat menjadi iterator untuk loop berikutnya.
sumber
Urutan iterator mungkin tampak kontra-intuitif.
Ambil contoh:
[str(x) for i in range(3) for x in foo(i)]
Mari kita uraikan:
sumber
[(output in loop 2) (loop 1) (loop 2)]
dengan(loop 1) = for i in range(3)
dan(loop 2) = for x in foo(i):
dan(output in loop 2) = str(x)
.ThomasH telah menambahkan jawaban yang bagus, tetapi saya ingin menunjukkan apa yang terjadi:
Saya kira Python mem-parsing daftar pemahaman dari kiri ke kanan. Ini artinya,
for
loop pertama yang terjadi akan dieksekusi terlebih dahulu."Masalah" kedua adalah bahwa hal ini
b
"bocor" keluar dari pemahaman daftar. Setelah pemahaman daftar sukses pertamab == [3, 4]
.sumber
x = 'hello';
[x for x in xrange(1,5)];
print x # x is now 4
Jika Anda ingin mempertahankan array multi dimensi, Anda harus membuat kurung array. lihat contoh di bawah ini di mana satu ditambahkan ke setiap elemen.
sumber
Teknik memori ini banyak membantu saya:
[ <RETURNED_VALUE> <OUTER_LOOP1> <INNER_LOOP2> <INNER_LOOP3> ... <OPTIONAL_IF> ]
Dan sekarang Anda bisa memikirkan R eturn + O uter-loop sebagai satu-satunya R ight O rder
Mengetahui di atas, urutan daftar lengkap bahkan untuk 3 loop sepertinya mudah:
karena di atas hanyalah:
untuk iterasi satu daftar / struktur bersarang, tekniknya sama: untuk
a
dari pertanyaan:untuk satu tingkat bersarang lainnya
dan seterusnya
sumber
Saya merasa ini lebih mudah dimengerti
sumber
Selain itu, Anda bisa menggunakan variabel yang sama untuk anggota daftar input yang saat ini diakses dan untuk elemen di dalam anggota ini. Namun, ini bahkan membuatnya lebih (daftar) tidak bisa dipahami.
Pertama
for x in input
dievaluasi, mengarah ke satu anggota daftar input, kemudian, Python berjalan melalui bagian keduafor x in x
selama nilai-x ditimpa oleh elemen saat ini mengaksesnya, kemudian yang pertamax
menentukan apa yang ingin kita kembalikan.sumber
Fungsi flatten_nlevel ini memanggil daftar1 bersarang secara rekursif untuk rahasia ke satu level. Coba ini
keluaran:
sumber
flatten_nlevel(sublist, flat_list)
, kan ?!