2017-02-16 2 views
2

私はリスト上で非常に多くの質問を巡って私が探しているものを見つけることができません。Pythonで反復的に作成されたネストされたリストで上記のレベルを選択してください

私は、いくつかの値をラップする中括弧と値を含む中括弧のペアを含む文字列を持っています。私はこれを反復処理したい

{121 {12} 12 {211} 2}

:私は構造がネストされている最も深いレベルを知りませんが、それは次のようになります次の擬似コードと同様に、ネストされたリストに、それを文字列と転送:

for i in thestring 
if there is a leftbrace { start a new list inside the current list 
elseif there is a rightbrace } close the current list and select the list on the level above 
else add i to currently selected list 

私はリストのレベルを上に移動し、現在のサブリストに

+0

おそらく、再帰的な解析関数をしたいです。 – TemporalWolf

答えて

2
def listify(s): 
    i = iter(s) 
    l = [] 
    for c in i: 
     if c == '{': 
      l.append(listify(i)) 
     elif c == '}': 
      return l 
     else: 
      l.append(c) 
    return l[0] 
を閉じる方法見当がつかない

トリックは再帰関数を使用して、どのリストにいるかを追跡するためにスタックを使用します。iterを使用して、文字列を再処理呼び出しに渡すことができます。ここで

>>>listify(s) 
['1', '2', '1', ['1', '2'], '1', '2', ['2', '1', '1'], '2'] 
+0

これを使用して作成された特定のネストされたリストにアクセスするにはどうすればよいですか? – Davtho1983

+0

下位レベルの2番目のサブリストの2番目の項目にアクセスしたい場合(この場合は1〜3番目の数字) – Davtho1983

+0

リストは本当にそれほど良いものではありません。それはより多くの木のような構造をしたいかもしれないように聞こえます –

0

はタプルのセットを作成するために、正規表現とast.literal_evalを使用して一つの方法である:

In [78]: s = "{121{12}12{211}2}" 

In [79]: new = re.sub(r'(})(?!$)|(?<!^)({)',lambda x : {'{': ',(', '}': ',),'}[x.group(0)], s) 

In [80]: ast.literal_eval(new) 
Out[80]: {121, (211,), 2, 12, (12,)} 
関連する問題