蟒:功能弄平含有另一种发生器发生器(Python: Function to flatten gene

2019-07-30 11:11发布

我想知道如何编写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产量。

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

这是必要的扁平化函数返回发电机呢! (因为否则的话,发电机的使用前述将是毫无意义的)。

只是要注意,我使用python 3。

谢谢!

Answer 1:

最简单的方法是一个递归平坦化作用。 假设你要下降到除了字符串每次迭代,你可以这样做:

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


Answer 2:

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

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


文章来源: Python: Function to flatten generator containing another generator