Я хотел бы использовать zip для пошагового перебора элементов различных генераторов. Какие генераторы и сколько их будет, известно только во время выполнения. Однако я не могу понять, как передать это в zip-архив, так как любой список будет интерпретироваться как повторяющийся, а не как список итераций, которые должны быть одновременно итерированы.
Как правильно это сделать? Кроме того, как правильно распаковывать выходы, если их количество неизвестно до времени выполнения? Ниже показано, что я пробовал
from typing import List
l_1 = [1, 2, 3]
l_10 = [10, 20, 30]
l_100 = [100, 200, 300]
def gen(l_: List):
for i in l_:
yield i
# Standard: works fine as expected
for i, j, k in zip(gen(l_1), gen(l_10), gen(l_100)):
print('i={}, j={} k={}'.format(i,j,k))
# List of generators prepared at run time. Does not work
gens = [gen(l_1), gen(l_100)]
receive = [None] * len(gens)
for receive in zip(gens):
print(receive)
Результат:
i=1, j=10 k=100
i=2, j=20 k=200
i=3, j=30 k=300
(<generator object gen at 0x000001C3DB93C258>,)
(<generator object gen at 0x000001C3DB93C620>,)
Желаемый результат:
i=1, j=10 k=100
i=2, j=20 k=200
i=3, j=30 k=300
[1, 100]
[2, 200]
[3, 300]
Как я могу получить zip, чтобы распознать, что gens не итерация, которую нужно перебирать, а список итераций, которые необходимо перебирать на шаге блокировки?