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

Python:当列表仅在运行时确定时,如何将iterables列表传递给zip?,python,iterator,itertools,Python,Iterator,Itertools,我想使用zip在锁步中迭代各种生成器的元素。只有在运行时才能知道哪些生成器以及它们的数量。 但是,我不知道如何将其传递到zip中,因为任何列表都将被解释为一个iterable,而不是必须同时迭代的iterable列表 正确的方法是什么? 另外,当输出的数量直到运行时才知道时,正确的解包方法是什么? 下面是我尝试过的 from typing import List l_1 = [1, 2, 3] l_10 = [10, 20, 30] l_100 = [100, 200, 300] def g

我想使用zip在锁步中迭代各种生成器的元素。只有在运行时才能知道哪些生成器以及它们的数量。 但是,我不知道如何将其传递到zip中,因为任何列表都将被解释为一个iterable,而不是必须同时迭代的iterable列表

正确的方法是什么? 另外,当输出的数量直到运行时才知道时,正确的解包方法是什么? 下面是我尝试过的

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不是一个迭代的iterable,而是必须在锁步中迭代的iterable列表?

这只是一个小小的变化,要将iterable列表传递给zip,您必须使用*

运行时准备的发电机列表。不起作用 gens=[genl_1,genl_100] 接收=[无]*长度 对于zip*gens格式的接收: 打印列表接收 编辑:
因为您希望在输出中包含列表,所以我必须显式地将receive转换为列表。

这只是一个小小的变化,要将一个iterables列表传递给zip,您必须使用*

运行时准备的发电机列表。不起作用 gens=[genl_1,genl_100] 接收=[无]*长度 对于zip*gens格式的接收: 打印列表接收 编辑:
因为您希望在输出中包含列表,所以我必须显式地将receive转换为列表。

Nice。非常感谢。你觉得接收位怎么样?这样做合理吗?还有别的办法吗?我还没看过呢!我不知道“接收”代表什么。当您使用receive=[None]*lengens时,这是否意味着在循环运行不正常时作为备份?因为命名循环变量receive也会覆盖非对象列表。所以请记住,循环中的receive变量将是tuple类型的不可变列表,如果需要对其进行操作,则应将其转换为可变的内容。receive=listreceive可能是个不错的黑客,我猜是的,receive=[None]*lengens没有任何用处。可以安全地移除。我机械地声明了一个具有正确维度的变量来接收zip结果。显然,这不会发生,也不需要。我还没有用Python思考……我无法想象当您已经习惯了这些较低级别的步骤时,学习Python会是什么样子。我无法理解初始化/声明/定义变量之间的差异。我想,Pythonic思想可能是有限的,但我必须说,它允许我们以性能为代价,更多地思考整个算法。非常感谢。你觉得接收位怎么样?这样做合理吗?还有别的办法吗?我还没看过呢!我不知道“接收”代表什么。当您使用receive=[None]*lengens时,这是否意味着在循环运行不正常时作为备份?因为命名循环变量receive也会覆盖非对象列表。所以请记住,循环中的receive变量将是tuple类型的不可变列表,如果需要对其进行操作,则应将其转换为可变的内容。receive=listreceive可能是个不错的黑客,我猜是的,receive=[None]*lengens没有任何用处。可以安全地移除。我机械地声明了一个具有正确维度的变量来接收zip结果。显然,这不会发生,也不需要。我还没有用Python思考……我无法想象当您已经习惯了这些较低级别的步骤时,学习Python会是什么样子。我无法理解初始化/声明/定义变量之间的差异。我想,python思想可能是有限的,但我必须说,它允许我们以牺牲性能为代价来更多地思考整个算法