返回一个像zip这样的元组列表,使用理解一次递增地生成一个元组

2024-09-28 23:26:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个不使用zip的函数,从序列列表中一次返回一个元组。我试着用这种方式来做:

gen1=[(x,y)for x in range(3) for y in range(4)]

其中列出了以下列表:

^{pr2}$

接下来,我尝试一次返回一个元组:

next(gen1)

但是发生了一个错误,该列表不是“iterable”。我怎么能用发电机呢。在


Tags: 函数in列表for错误方式range序列
2条回答

如果您希望行为能够处理任意数量的序列,而问题中仍然存在一些含糊不清的地方,那么如果您要做的只是生成一个zip的生成器版本,那么下面的方法应该可以很好地工作:

def generator_zip(*args):
    iterators = map(iter, args)
    while iterators:
        yield tuple(map(next, iterators))

首先,它将每个参数转换为迭代器,然后继续生成包含每个迭代器的下一个相关项的元组,直到最短列表用尽。在

从Python 2.4开始,您可以:

gen1 = ((x, y) for x in range(3) for y in range(4))

请注意,您总是可以使用iter从列表中生成生成器(好吧,迭代器):

^{pr2}$

使用上的区别将是零。第二种方法需要整个列表都在内存中,而第一种方法则不需要。在

注意,您还可以使用zip的内置功能,这是一个生成器(在python3中)。在python2中,使用itertools.izip。在

Python 3:

>>> zip(range(0, 5), range(3, 8))
<zip object at 0x7f07519b3b90>
>>> list(zip(range(0, 5), range(3, 8)))
[(0, 3), (1, 4), (2, 5), (3, 6), (4, 7)]

Python<;3:

# Python < 3
>>> from itertools import izip
>>> izip(range(0, 5), range(3, 8))
<itertools.izip object at 0x7f5247807440>
>>> list(izip(range(0, 5), range(3, 8)))
[(0, 3), (1, 4), (2, 5), (3, 6), (4, 7)]
>>> zip(range(0, 5), range(3, 8))
[(0, 3), (1, 4), (2, 5), (3, 6), (4, 7)]

相关问题 更多 >