首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:用于扁平化包含另一个生成器的生成器的函数

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

Stack Overflow用户
提问于 2012-07-16 19:12:28
回答 2查看 3.2K关注 0票数 9

我想知道如何编写python函数,它可以扁平化生成器产生另一个生成器或iteables (这也可以产生另一个生成器/迭代器…可能是无限的)。

下面是一个例子:

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

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

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

扁平化函数也有必要返回生成器!(因为否则,以前使用生成器将是毫无意义的)。

需要注意的是,我使用的是python 3。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-16 19:21:40

最简单的方法是递归展平函数。假设您想要深入到除字符串之外的所有可迭代对象,您可以这样做:

代码语言:javascript
运行
复制
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

从Python 3.3开始,您还可以编写

代码语言:javascript
运行
复制
def flatten(it):
    for x in it:
        if (isinstance(x, collections.Iterable) and
            not isinstance(x, str)):
            yield from flatten(x)
        else:
            yield x
票数 14
EN

Stack Overflow用户

发布于 2012-07-16 20:20:46

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

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11503065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档