Python:仅在运行时确定列表时,如何将可迭代列表传递给zip?

问题描述 投票:0回答:1

我想使用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不是要迭代的迭代器,而是必须在锁定步骤中迭代的可迭代项列表?

python iterator itertools
1个回答
1
投票

这只是一个小小的更改,要传递可迭代项列表以进行压缩,您必须使用*对其进行解压缩>

# 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)
© www.soinside.com 2019 - 2024. All rights reserved.