Saya ingin mengubah kode berikut
for directory, dirs, files in os.walk(directory_1):
do_something()
for directory, dirs, files in os.walk(directory_2):
do_something()
ke kode ini:
for directory, dirs, files in os.walk(directory_1) + os.walk(directory_2):
do_something()
Saya mendapatkan kesalahan:
jenis operan yang tidak didukung untuk +: 'generator' dan 'generator'
Bagaimana cara bergabung dengan dua generator di Python?
Jawaban:
Saya pikir
itertools.chain()
harus melakukannya.sumber
itertools.chain()
tidak mengembalikan sebuahtypes.GeneratorType
instance. Untuk berjaga-jaga, tipe yang tepat sangat penting.Contoh kode:
sumber
itertools.chain()
?Dengan Python (3,5 atau lebih besar) yang dapat Anda lakukan:
sumber
def chain(*iterables): for iterable in iterables: yield from iterable
(Tempatkandef
danfor
pada baris terpisah ketika Anda menjalankannya.)a
diperiksa sampai semuanya dihasilkan darinya, meskipunb
bukan iterator. TheTypeError
untukb
tidak menjadi iterator akan datang kemudian.Contoh sederhana:
sumber
itertools.chain()
?itertools.chain
mengembalikan iterator, bukan generator.chain([1, 2, 3], [3, 4, 5])
?Dengan itertools.chain.from_iterable Anda dapat melakukan hal-hal seperti:
sumber
genny
ketika sudah mengembalikan generator.list(itertools.chain.from_iterable(genny(x)))
jauh lebih ringkas.list
konstruktor jauh lebih mudah dibaca daripada pemahaman daftar. Metode Anda jauh lebih tidak dapat dibaca dalam hal itu.Ini dia menggunakan ekspresi generator dengan nested
for
s:sumber
Satu juga dapat menggunakan operator membongkar
*
:CATATAN: Bekerja paling efisien untuk iterables 'non-malas'. Dapat juga digunakan dengan berbagai jenis pemahaman. Cara yang disukai untuk concat generator adalah dari jawaban dari @Uduse
sumber
Jika Anda ingin membuat generator terpisah tetapi tetap iterate pada mereka pada saat yang sama Anda dapat menggunakan zip ():
CATATAN: Iterasi berhenti di yang lebih pendek dari dua generator
Sebagai contoh:
sumber
Katakanlah kita harus generator (gen1 dan gen 2) dan kami ingin melakukan beberapa perhitungan tambahan yang membutuhkan hasil dari keduanya. Kita dapat mengembalikan hasil fungsi / perhitungan tersebut melalui metode peta, yang pada gilirannya mengembalikan generator yang bisa kita lewati.
Dalam skenario ini, fungsi / perhitungan perlu diimplementasikan melalui fungsi lambda. Bagian yang sulit adalah apa yang ingin kita lakukan di dalam peta dan fungsi lambda-nya.
Bentuk umum dari solusi yang diusulkan:
sumber
Semua solusi rumit itu ...
kerjakan saja:
Jika Anda benar-benar ingin "bergabung" dengan kedua generator, maka lakukan:
sumber
Saya akan mengatakan itu, seperti yang disarankan dalam komentar oleh pengguna "wjandrea", solusi terbaik adalah
Itu tidak mengubah tipe yang dikembalikan dan benar-benar pythonic.
sumber