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 gen2ma mniej elementów, jeden dodatkowy element gen1jest „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 ( 8w moim poprzednim przykładzie), ponieważ gen1jest 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 gen2jest „dłuższy”, nie ma takiego „problemu”.
PYTANIE : Czy istnieje sposób na odzyskanie tej brakującej wartości (tj. 8W moim poprzednim przykładzie)? ... najlepiej ze zmienną liczbą argumentów (podobnie jak ziprobi).
UWAGA : Obecnie zaimplementowałem w inny sposób, używając, itertools.zip_longestale naprawdę zastanawiam się, jak uzyskać tę brakującą wartość przy użyciu ziplub 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ę 8z gen1, to nie ma.