Я хочу проанализировать 2 генератора (потенциально) разной длины с помощью zip
:
for el1, el2 in zip(gen1, gen2):
print(el1, el2)
Однако, если gen2
есть меньше элементов, один дополнительный элемент gen1
«потребляется».
Например,
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
Очевидно, что значение отсутствует ( 8
в моем предыдущем примере), потому что gen1
читается (таким образом генерируя значение 8
) до того, как оно осознает gen2
, что в нем больше нет элементов. Но эта ценность исчезает во вселенной. Когда gen2
«дольше», такой «проблемы» нет.
ВОПРОС : Есть ли способ получить это пропущенное значение (т.е. 8
в моем предыдущем примере)? ... в идеале с переменным количеством аргументов (как это zip
делает).
ПРИМЕЧАНИЕ : я в настоящее время реализовал по-другому с помощью, itertools.zip_longest
но мне действительно интересно, как получить это пропущенное значение, используя zip
или эквивалентный.
ПРИМЕЧАНИЕ 2 : Я создал несколько тестов различных реализаций в этом REPL на случай, если вы захотите отправить и попробовать новую реализацию :) https://repl.it/@jfthuong/MadPhysicistChester
zip()
прочитал 8
с gen1
, это пошло.