2013-01-20 3 views
0

다음과 같은 구조로 공백으로 구분 된 데이터가 포함 된 텍스트 파일이 있습니다. '분기 수'... 0 (0 의미 더 이상 가지 않는다) 예를 들어 :Python : 텍스트 파일의 데이터와 같은 트리를 읽고 사전에 저장

1 A 3 B 2 C 0 
     D 0 
    E 1 F 0 
    G 2 H 0 
     I 0 

처럼 해당 사전 '나무'해야한다 : 나는 재귀 방법은 그것을 할 올바른 방법이라고 생각하지만, 내가 할 수없는 오전

tree = {'A': {'B': {'C': {}, 
        'D': {}}, 
       'E': {'F': {}}, 
       'G': {'H': {}, 
        'I': {}}}} 

그것은 작동합니다. 지금까지 기능을 다음 있습니다 : 도움에 미리

def constructNodes(branch): 

    global nodes_temp 

    if not branch: 
     branch = deque(file.readline().strip().split()) 
    node1 = branch.popleft() 
    nodes_temp.add(node1) 
    nbBranches = int(branch.popleft()) 
    for i in xrange(nbBranches): 
     constructNodes(branch) 
    return nodes_temp 

감사합니다.

+0

'tree'는 유효한 Python 개체가 아닙니다. – unutbu

+0

게시하기 전에 확인해야합니다. '나무'는 내가 파일에서 읽은 후 얻고 자하는 것입니다. 그래서 나는 그것을 수동으로 만들었습니다, 아마 나는 실수를했습니다. 나는 지금 나무를 바로 잡았다. 덕분에 – user1993753

답변

3

: 일부 서식으로

{'A': {'B': {'C': {}, 'D': {}}, 'G': {'H': {}, 'I': {}}, 'E': {'F': {}}}} 

시퀀스를 사용하면 일반 파이썬 반복 가능을 사용할 수 있습니다. 그것은 훨씬 더 간결하게 만들 수 있습니다.

data = """ 
1 A 3 B 2 C 0 
     D 0 
    E 1 F 0 
    G 2 H 0 
     I 0""" 

def construct_nodes(data): 
    return dict((next(data), construct_nodes(data)) 
       for _ in xrange(int(next(data)))) 

print construct_nodes(iter(data.split())) 
+0

이것은 위 코드와 더 간결하고 동일한 결과를 제공합니다. 답변을 주셔서 감사합니다. – user1993753

+0

위의 코드에서 Mark Tolonen의 대답을 의미합니다. – user1993753

2

나는 이것이 당신이 원하는 생각 :

from collections import deque 

data = deque('''\ 
1 A 3 B 2 C 0 
     D 0 
    E 1 F 0 
    G 2 H 0 
     I 0'''.split()) 

def constructNodes(): 
    D = {} 
    count = int(data.popleft()) 
    for _ in range(count): 
     node = data.popleft() 
     D[node] = constructNodes() 
    return D 
tree = constructNodes() 
print(tree) 

출력 : 당신은 반복하는 양단 큐가 필요하지 않습니다

{'A': {'B': {'C': {}, 
      'D': {}}, 
     'G': {'H': {}, 
      'I': {}}, 
     'E': {'F': {}}}} 
+0

Mark에게 감사 드려요. 그게 내가 찾고 있던 것입니다. 산출물의 형식은 읽기 쉽게하기위한 것이었다. 코드는 매력처럼 작동합니다. – user1993753

관련 문제