1

私はこの文字列を持っています:

[a [a b] [c e f] d]

そして、私はこのようなリストが欲しい

lst[0] = "a"
lst[1] = "a b"
lst[2] = "c e f"
lst[3] = "d"

私がエレガント/pythonicとは思わない私の現在の実装は、2つの再帰関数です(1つは '[' で分割し、もう1つは ']' で分割します)が、リスト内包表記または正規表現を使用して実行できると確信しています(しかし、私はできますそれを行うための正気な方法を理解していません)。

何か案は?

4

3 に答える 3

4

実際には、これは再帰的なデータ構造ではありません。adが別々のリストにあることに注意してください。文字列を括弧文字で分割し、空白を取り除くだけです。

誰かがよりクリーンなものを見つけることができると確信していますが、ワンライナーが必要な場合は、次のようなものが必要です。

parse_str = '[a [a b] [c e f] d]'
lst = [s.strip() for s in re.split('[\[\]]', parse_str) if s.strip()]

>>>lst
['a', 'a b', 'c e f', 'd']
于 2009-07-23T16:20:25.247 に答える
1

再帰的なデータ構造の場合、再帰はそれをトラバースするのに適しています。 ただし、構造を作成するために文字列を解析することは、再帰的である必要はありません。私がそれを行う別の方法の1つは、反復です。

origString = "[a [a b] [c [x z] d e] f]".split(" ")
stack = []
for element in origString:
    if element[0] == "[":
        newLevel = [ element[1:] ]
        stack.append(newLevel)
    elif element[-1] == "]":
        stack[-1].append(element[0:-1])
        finished = stack.pop()
        if len(stack) != 0:
            stack[-1].append(finished)
        else:
            root = finished
    else:
        stack[-1].append(element)
print root

もちろん、これはおそらく改善される可能性があり、文字列の...のリストのリストのリストを作成しますが、これはあなたの例が望んでいたものではありません。ただし、ツリーの任意の深さを処理します。

于 2009-07-23T16:45:24.960 に答える
1

それが再帰的なデータ構造である場合、きれいにナビゲートするには再帰関数が必要になります。

しかし、Python には便利なトークナイザー ライブラリがあります: http://docs.python.org/library/tokenize.html

于 2009-07-23T15:56:43.827 に答える