Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:用于展平包含另一个生成器的生成器的函数_Python_Python 3.x_Generator - Fatal编程技术网

Python:用于展平包含另一个生成器的生成器的函数

Python:用于展平包含另一个生成器的生成器的函数,python,python-3.x,generator,Python,Python 3.x,Generator,我想知道如何编写python函数,该函数可以展平生成器,从而生成另一个生成器或iteables(也可以生成另一个生成器/iterables…可能无限) 下面是一个例子: gen(gen(1,2,3),gen(4,5,6),[7,8,9],[gen(10,11,12),gen(13,14,15)]) 注:gen-表示生成器对象,gen后括号内的内容是生成器将生成的数据 “展平”后的预期结果: gen(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) 展平功能也必须返回生成器

我想知道如何编写python函数,该函数可以展平生成器,从而生成另一个生成器或iteables(也可以生成另一个生成器/iterables…可能无限)

下面是一个例子:

gen(gen(1,2,3),gen(4,5,6),[7,8,9],[gen(10,11,12),gen(13,14,15)])

注:
gen
-表示生成器对象,
gen
后括号内的内容是生成器将生成的数据

“展平”后的预期结果:
gen(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)

展平功能也必须返回生成器!(因为否则,发电机的继续使用将毫无意义)

请注意,我使用的是Python3


谢谢

最简单的方法是递归展平函数。假设您希望深入到除字符串以外的所有iterable中,可以执行以下操作:

def flatten(it):
    for x in it:
        if (isinstance(x, collections.Iterable) and
            not isinstance(x, str)):
            for y in flatten(x):
                yield y
        else:
            yield x
从Python3.3开始,您还可以编写

def flatten(it):
    for x in it:
        if (isinstance(x, collections.Iterable) and
            not isinstance(x, str)):
            yield from flatten(x)
        else:
            yield x

非递归方法本质上是使用堆栈展开递归方法:

def flatten(it):
    stack = []
    it = iter(it)
    while True:
        try:
            x = next(it)
        except StopIteration:
            if stack:
                it = stack.pop()
                continue
            else:
                return
        if isinstance(x, collections.Iterable) and not isinstance(x, str):
            stack.append(it)
            it = iter(x)
        else:
            yield x

非常感谢你!通过我的努力,我离你很近:-)你好+1-我总是忘记从中获得的
收益,这是一个很好的提醒。@JonClements:你“总是忘记”一个尚未发布的Python版本的特性?我很惊讶我的水晶球最近已经完全正常工作了!?;)[但严肃地说,我碰巧关注政治公众人物]