izip中的izip:打开生成器的包装?

2024-06-23 20:17:12 发布

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

我有一个生成器的列表lglg = [g1, g2, ..., gn]。这些生成器被合并为一个具有izipG = izip(*lg)的生成器。{{{cd6}的结果通常是由cd6}生成的。但是,我需要解包元组,即当迭代G时,G应该生成一个没有嵌套元组的元组。当构造G时,是否可以对g1进行解压缩?在

编辑:示例(来自@jsbueno的shortend版本):

from itertools import izip

g1 = izip(xrange(1,3), xrange(3,5))
g2 = xrange(10, 13)
g3 = xrange(20, 23)

lg = [g1, g2, g3]

for i in izip(*lg):
    print i

生产

^{pr2}$

但我需要

(1, 3, 10, 20)
(2, 4, 11, 21)

Tags: 版本编辑示例列表元组g1lgg2
1条回答
网友
1楼 · 发布于 2024-06-23 20:17:12

因为“izip”需要关于内部izip内部迭代器的信息,而izip在这方面是不透明的(也就是说,你不能获取给定izip对象的izip的参数),所以我们要做的就是重新实现izip的功能,但要以一种意识到它的方式-如果传递的迭代器是一个元组,用于将其连接到结果中,而不是将其作为单个项添加:

class FlatIzip(object):
    def __init__(self, *args):
        self.generators = args
    def __iter__(self):
        iters = [iter(x) for x in self.generators]
        while True:
            result = []
            for iterator in iters:
                element = iterator.next()
                if isinstance(element, tuple):
                    result += list(element)
                else:
                    result.append(element)
            yield tuple(result)

#Example:

from itertools import izip

g1 = xrange(10)
g2 = xrange(10,20)
g3 = xrange(20, 30)
g4 = izip(xrange(40,50), xrange(50,60))


lg = [g1, g2, g3, g4]

for x in FlatIzip(*lg):
    print x

相关问题 更多 >

    热门问题