Python: Как передать список файлов в zip-архив, если список определяется только во время выполнения? - PullRequest
1 голос
/ 29 мая 2020

Я хотел бы использовать 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 не итерация, которую нужно перебирать, а список итераций, которые необходимо перебирать на шаге блокировки?

1 Ответ

3 голосов
/ 29 мая 2020

Это будет лишь небольшое изменение, чтобы передать список итераций в zip, вам нужно распаковать его, используя *

# 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(list(receive))

edit:
, поскольку вы ожидали списки в своем выводе I пришлось явно преобразовать получение в список.

...