1

YAMLのように見えるデータがいくつかありますが、そうではありません。これが例です。

An instance of A
  objectID=123
  family=abc

An instance of A
  objectID=234
  family=bcd
  List of 4 X elements:
    An instance of X:
      objectID=222
      name=ccc
    An instance of X:
      objectID=333

等々...

私はそれをもっとこのように見せるための方法を見つける必要があります:

[
  {'name': 'An instance of A',
   'data': [
     {'objectID': 123,
      'family': 'abc'
     }
   ]
 },
 ...

これを解析するために再帰関数を作成しようとしましたが、混乱してしまいます。

完全に機能する例を求めているわけではありませんが、Pythonでこれを行うための最良の方法は何ですか?自己呼び出し機能?別のlib(まだ見つけていません)を使用していますか?別の言語を使用して私を助け、すべてをPythonに埋め込みますか?

4

1 に答える 1

3

スタックを使用し、インデントのレベルが多かれ少なかれ見つかったら、スタックからアイテムをプッシュしてポップします。スタックの各レベルは、インデントの深さとエントリを保持します。

stack = [(0, {})]  # indentation level, top-level entry
entry = stack[-1][1]

for line in input:
    line = line.strip()
    if not line: continue

    indentation = len(input) - len(input.lstrip())
    if indentation > stack[-1][0]:  # indented further? New entry
        entry = stack[-1][1]['data'] = {}
        stack.append((indentation, entry)) # push
    else:
        while indentation < stack[-1][0]:  # indentation dropped
            del stack[-1]       # pop
            entry = stack[-1][1]

    # process line and add to entry

result = stack[0][1]
于 2012-11-26T11:47:26.220 に答える