2013-11-23 2 views
2

설정 괄호와 숫자를 사용하여 트리를 파싱하는 프로그램을 만들어야합니다. 따라서 각 괄호는 트리의 노드를 나타내며 프로그램은 각 부모 노드의 모든 자식 노드를 출력합니다. 파이썬 코드는 다음과 같습니다 :파이썬을 사용하여 트리를 파싱

class context(object): 
    def __init__(self, label=None, parent=None, children=[]): 
     self.label = label 
     self.parent = parent 
     self.children = [] 
     self.list = [] 

    def make_tree(self, tree): 
     stack = [] 
     index = 0 
     while index < len(tree): 
      if tree[index] is '(': 
       if self.label is None: 
        self.label = tree[index+1] 
        index = index+1 
       else: 
        if len(stack) == 0: 
         stack.append(context(tree[index+1], self.label)) 
         index = index+1 
        else: 
         stack.append(context(tree[index+1], stack[len(stack)-1].label)) 
         index = index+1 

      elif tree[index] is ')': 
       if len(stack) == 1: 
        self.children.append(stack.pop()) 
        return 
       else: 
        stack[len(stack)-2].children.append(stack.pop()) 
      index = index+1 

    def traverse(self, size, obj): 
     if self.label is None or size == 0: 
      return [] 
     temp_list = [] 
     temp = [] 
     dic = {} 
     tt = [children.label for children in obj.children] 
     dic[obj.label] = tt 
     temp.append(dic) 
     for child in obj.children: 
      temp_list = child.traverse(len(child.children), child) 
     print temp 
     return temp + temp_list 


line = '(Root (1 (2) (3 (4) (5) ) (6 (7) (8 (9) ) ) ) ) '.split() 
test = context() 
test.make_tree(line) 
final = test.traverse(len(test.children), test) 

결과는 다음과 같습니다. Result

make_tree 함수를 사용하여 목록을 인쇄하면 올바른 결과를 얻습니다. 그러나 최종 결과가 올바르지 않습니다. 이 경우 {3 ': ['4 ','5 ']가 누락되었습니다. final result

의견이 있으십니까?

for child in obj.children: 
    temp_list += child.traverse(len(child.children), child) 
+0

:

def traverse(self, size, obj, tmpList): if self.label is None or size == 0: return [] dic = {} tt = [children.label for children in obj.children] dic[obj.label] = tt tmpList.append(dic) for child in obj.children: child.traverse(len(child.children), child, tmpList) return tmpList 

다음과 같은 방법으로이 전화를? 왜냐하면 나는 단지'{{ 'Root': [ '1'}]]'를 보았 기 때문입니다. – p0lAris

+0

@ flippex17이 코드를 실행 한 후에 final을 입력하면됩니다. – eChung00

+0

오, 미안하지만,별로 관심을 기울이지 않았습니다. 나는 그것을 들여다 볼 것이다. – p0lAris

답변

1

난 그냥 코드의 일부 보았다 :

+0

고맙습니다. – eChung00

1

당신은 당신이 아마 할 대신 원하는, temp_list하는 과제와 자식 결과를 덮어 씁니다. 그것은 많은 시간을 가지고 있지 않았기 때문에 실제로 디버깅 할 수는 없었지만, tmpList를 소유하고 기본적으로 모든 지점에서 업데이트를 유지함으로써 구현할 수도 있습니다. Alko의 솔루션도 잘 작동하지만 이것은 좀 더 명확합니다. 어떻게 마지막을 인쇄하는

final = test.traverse(len(test.children), test, []) 
+0

대단히 감사합니다 !! – eChung00

관련 문제