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 

은에 구문 분석 한 반복 처리/이송/나무가 포맷 도보 수있는 방법

[('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

확인. 코드가 작동하지 않습니다. 나는 그것을 붙일 것이다. 그러나 그것은 아무데도 가까이 있지 않다. 내가 여기에서 달성하고자하는 것은 형식이 지정된 트리 (변수 목록)를 탐색하는 것입니다. – Firebowl2000

+1

그냥 털어 내지 말고 [mcve]로 자르십시오. 그것은 * "아무데도 가까이"*, 당신은 아마 너무 아직 그 질문에 대한 준비가되지 않습니다. – 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