2016-06-12 3 views
0

ツリー構造:リスト、タプル、文字列からなるこのツリーを「歩く」方法は?

[('T', 
    [('A1', ['B1', ('B2', ['D1'])]), 
    ('A2', ['C1', 'C2', ('C3', [('E1', ['F1']), ('E2', ['G1', 'G2'])])])])] 

か(同じもの):

T 
|__A1 
| |__B1 
| |__B2 
|  |__D1 
|__A2 
    |__C1 
    |__C2 
    |__C3 
     |__E1 
      |__F1 
      E2 
      |__G1 
      |__G2 

がに解析される

1反復/トラバース/でフォーマットされたツリーを歩くことができる方法
[('T', 
    [('A1', 
    [ 
    'B1', 
    ('B2', ['D1']) 
    ] 
    ), 
    ('A2', 
    [ 
    'C1', 
    'C2', 
    ('C3', 
     [ 
     ('E1', ['F1']), 
     ('E2', ['G1', 'G2']) 
     ] 
    ) 
    ] 
    ) 
    ] 
)] 

こちらです?私はこれがむしろ特定の問題であることを知っていますが、私は本当にこの時点で固執しています。

T A1 B1 
T A1 B2 D1 
T A2 C1 
T A2 C2 
T A2 C3 E1 F1 
T A2 C3 E2 G1 
T A2 C3 E2 G2 

コードどこにもありません:これは(:文字列のリストタイプは重要ではありませんが、たとえばことができる)のように期待される目標は、出力にルートから各エンドノードへのすべての可能なルートであります作業に近いが、それは一般的な傾き表示されることがあります。

formatted_tree = [('T',[('A1', ['B1', ('B2', ['D1'])]),('A2', ['C1', 'C2', ('C3', [('E1', ['F1']), ('E2', ['G1', 'G2'])])])])] 

def walk(n): 
    if isinstance(n, basestring): 
     yield n # end-branches 
    else: 
     if isinstance(n, tuple): # root,[bra,nch,es] 
      yield n[0] 
      walk(n[1]) 
     elif isinstance(n, list): # LIST=branches (can be tuples or string) 
      for branch in n: 
       walk(branch) 

[path for path in walk(formatted_tree)] 
+2

あなたのコードはどこにありますか?その問題は正確には何ですか? – jonrsharpe

+0

OK。コードが機能していません。私はそれを貼り付けますが、それはどこにもありません。私がここで達成しようとしているのは、フォーマットされたツリー(リスト変数)をトラバースすることです。 – Firebowl2000

+1

ダンプインするだけではなく、[mcve]に切り落としてください。それが*「どこにも近づかない」*の場合、おそらくまだSOの質問の準備が整っていないでしょう。 – jonrsharpe

答えて

1

このコードは、それが結果のリストを保持し

tree = [('T', 
    [('A1', ['B1', ('B2', ['D1'])]), 
    ('A2', ['C1', 'C2', ('C3', [('E1', ['F1']), ('E2', ['G1', 'G2'])])])])] 


def print_node(header, tree): 
    if isinstance(tree,str): 
     return [header+' '+str(tree)] 
    else: 
     head, tail = tree 
     return reduce(lambda a,b:a+b,[print_node(header + ' ' + head,t_element) for t_element in tail]) 

def print_tree(tree): 
    children = tree[0] 
    print '\n'.join(print_node('',children)) 

print_tree(tree) 

働くものを単純な再帰を実行します。 print_treeは入力を正しい形式で入れるためのラッパーです。 お手伝い願います!

+0

それはうまく動作します。どうもありがとう。 – Firebowl2000

関連する問題