2

私は次のPythonネストリスト構造を持っています:

test = ['a', ['c', ['e'], 'd'], 'b']

または同じ、フォーマットされたばかり:

test = [
    'a', 
        [
            'c', 
                [
                    'e'
                ], 
             'd'
        ], 
    'b'
]

最も内側のネストされたリストオブジェクト(「e」)から最も外側のリスト(「a」、[...]、「b」)まで逆の順序で、完全なリストを反復処理するのが最善の方法だろうかと考えていました。 。reverse(test)を呼び出しても、ネストされたリストではうまくいきません。また、反復のすべての深さでコールバック関数を呼び出すことができるはずです。

反復は次のようになります([xx] ==以前に呼び出されたコールバックから計算された値):

1st e --> callback(e)
2nd c [e] d --> callback(c [e] d)
3rd a [c e d] b --> callback(a [c e d] b)

これが私の問題を説明することを願っています&あなたの助けに感謝します

4

2 に答える 2

6

私が提案する1つの可能な解決策は

>>> def foo(test):
    queue = []
    try:
        while True:
            queue.append(test)
            test = test[1]
    except IndexError:
        for e in reversed(queue):
            yield e


>>> data = foo(test)
>>> next(data)
['e']
>>> next(data)
['c', ['e'], 'd']
>>> next(data)
['a', ['c', ['e'], 'd'], 'b']
>>> next(data)

Traceback (most recent call last):
  File "<pyshell#753>", line 1, in <module>
    next(data)
StopIteration
>>> 

使い方

  1. 深さ優先をトラバースし、要素をキューにプッシュします
  2. 逆キューをループして要素を生成します
于 2013-02-19T15:01:24.353 に答える
6

あなたが探しているのは、構造のポストオーダートラバーサルです。

def traverse(l):
    for x in l:
        if isinstance(x, list):
            traverse(x)
    callback(l)

callbackとして定義されている場合、次のようprintになります。

['e']
['c', ['e'], 'd']
['a', ['c', ['e'], 'd'], 'b']
于 2013-02-19T15:06:21.853 に答える