Quero analisar 2 geradores de comprimento (potencialmente) diferente com zip
:
for el1, el2 in zip(gen1, gen2):
print(el1, el2)
No entanto, se gen2
tiver menos elementos, um elemento extra de gen1
é "consumido".
Por exemplo,
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, um valor está ausente ( 8
no meu exemplo anterior) porque gen1
é lido (gerando o valor 8
) antes que ele perceba gen2
que não possui mais elementos. Mas esse valor desaparece no universo. Quando gen2
é "mais longo", não existe esse "problema".
PERGUNTA : Existe uma maneira de recuperar esse valor ausente (ou seja, 8
no meu exemplo anterior)? ... idealmente com um número variável de argumentos (como zip
faz).
NOTA : No momento, eu implementei de outra maneira usando, itertools.zip_longest
mas realmente me pergunto como obter esse valor ausente usando zip
ou equivalente.
NOTA 2 : Criei alguns testes das diferentes implementações neste REPL, caso você queira enviar e tentar uma nova implementação :) https://repl.it/@jfthuong/MadPhysicistChester
zip()
tenha lido 8
a partir gen1
, ela se foi.