9

別のジェネレーターまたは itables を生成するジェネレーターをフラット化できる python 関数を作成する方法を知りたいです (別のジェネレーター/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)

flatten 関数もジェネレーターを返す必要があります! (そうしないと、以前のジェネレーターの使用が無意味になるため)。

念のため、私はpython 3を使用しています。

ありがとう!

4

2 に答える 2

15

最も簡単な方法は、再帰的な平坦化関数です。文字列を除くすべての 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

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 に答える