9

我想知道如何编写python函数,它可以使生成器变平,从而产生另一个生成器或可迭代对象(它也可以产生另一个生成器/可迭代对象......可能无限)。

这是示例:

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)

flatten 函数也必须返回生成器!(因为否则,生成器的前面使用将毫无意义)。

请注意,我使用的是 python 3。

谢谢!

4

2 回答 2

15

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

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 开始,还可以编写

def flatten(it):
    for x in it:
        if (isinstance(x, collections.Iterable) and
            not isinstance(x, str)):
            yield from flatten(x)
        else:
            yield x
于 2012-07-16T11:21:39.913 回答
0

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

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
于 2012-07-16T12:20:45.587 回答