2024-09-28 23:26:27 发布
网友
我需要一个不使用zip的函数,从序列列表中一次返回一个元组。我试着用这种方式来做:
gen1=[(x,y)for x in range(3) for y in range(4)]
其中列出了以下列表:
接下来,我尝试一次返回一个元组:
next(gen1)
但是发生了一个错误,该列表不是“iterable”。我怎么能用发电机呢。在
如果您希望行为能够处理任意数量的序列,而问题中仍然存在一些含糊不清的地方,那么如果您要做的只是生成一个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从列表中生成生成器(好吧,迭代器):
iter
使用上的区别将是零。第二种方法需要整个列表都在内存中,而第一种方法则不需要。在
注意,您还可以使用zip的内置功能,这是一个生成器(在python3中)。在python2中,使用itertools.izip。在
zip
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)]
如果您希望行为能够处理任意数量的序列,而问题中仍然存在一些含糊不清的地方,那么如果您要做的只是生成一个zip的生成器版本,那么下面的方法应该可以很好地工作:
首先,它将每个参数转换为迭代器,然后继续生成包含每个迭代器的下一个相关项的元组,直到最短列表用尽。在
从Python 2.4开始,您可以:
请注意,您总是可以使用
^{pr2}$iter
从列表中生成生成器(好吧,迭代器):使用上的区别将是零。第二种方法需要整个列表都在内存中,而第一种方法则不需要。在
注意,您还可以使用
zip
的内置功能,这是一个生成器(在python3中)。在python2中,使用itertools.izip
。在Python 3:
Python<;3:
相关问题 更多 >
编程相关推荐