Chcę przeanalizować 2 generatory (potencjalnie) różnej długości za pomocą zip
:
for el1, el2 in zip(gen1, gen2):
print(el1, el2)
Jeśli jednak gen2
ma mniej elementów, jeden dodatkowy element gen1
jest „konsumowany”.
Na przykład,
def my_gen(n:int):
for i in range(n):
yield i
gen1 = my_gen(10)
gen2 = my_gen(8)
list(zip(gen1, gen2)) # Last tuple is (7, 7)
print(next(gen1)) # printed value is "9" => 8 is missing
gen1 = my_gen(8)
gen2 = my_gen(10)
list(zip(gen1, gen2)) # Last tuple is (7, 7)
print(next(gen2)) # printed value is "8" => OK
Najwyraźniej brakuje wartości ( 8
w moim poprzednim przykładzie), ponieważ gen1
jest ona odczytywana (generując wartość 8
), zanim się zorientuje, gen2
że nie ma już żadnych elementów. Ale ta wartość znika we wszechświecie. Kiedy gen2
jest „dłuższy”, nie ma takiego „problemu”.
PYTANIE : Czy istnieje sposób na odzyskanie tej brakującej wartości (tj. 8
W moim poprzednim przykładzie)? ... najlepiej ze zmienną liczbą argumentów (podobnie jak zip
robi).
UWAGA : Obecnie zaimplementowałem w inny sposób, używając, itertools.zip_longest
ale naprawdę zastanawiam się, jak uzyskać tę brakującą wartość przy użyciu zip
lub równoważnej.
UWAGA 2 : Stworzyłem niektóre testy różnych implementacji w niniejszej REPL na wypadek, gdybyś chciał przesłać i wypróbować nową implementację :) https://repl.it/@jfthuong/MadPhysicistChester
zip()
zapoznał się 8
z gen1
, to nie ma.