Quiero analizar 2 generadores de (potencialmente) diferente longitud con zip
:
for el1, el2 in zip(gen1, gen2):
print(el1, el2)
Sin embargo, si gen2
tiene menos elementos, gen1
se "consume" un elemento adicional .
Por ejemplo,
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
Aparentemente, falta un valor ( 8
en mi ejemplo anterior) porque gen1
se lee (generando así el valor 8
) antes de darse gen2
cuenta de que no tiene más elementos. Pero este valor desaparece en el universo. Cuando gen2
es "más largo", no existe tal "problema".
PREGUNTA : ¿Hay alguna forma de recuperar este valor faltante (es decir, 8
en mi ejemplo anterior)? ... idealmente con un número variable de argumentos (como lo zip
hace).
NOTA : Actualmente lo he implementado de otra manera usando, itertools.zip_longest
pero realmente me pregunto cómo obtener este valor faltante usando zip
o equivalente.
NOTA 2 : He creado algunas pruebas de las diferentes implementaciones en este REPL en caso de que desee enviar y probar una nueva implementación :) https://repl.it/@jfthuong/MadPhysicistChester
zip()
haya leído 8
a partir gen1
, se ha ido.