Python:从文本文件中读取树状数据并存储在字典中

Python:从文本文件中读取树状数据并存储在字典中,python,recursion,tree,Python,Recursion,Tree,我有一个文本文件,其中包含类似于树的数据,由一个空格分隔,结构如下: “分支数”“节点名称”。。。0(0表示不再有分支) 例如: 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': {

我有一个文本文件,其中包含类似于树的数据,由一个空格分隔,结构如下: “分支数”“节点名称”。。。0(0表示不再有分支) 例如:

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

提前感谢您的帮助。

我想这就是您想要的:

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': {}}}}
使用一些格式:

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

我想这就是你想要的:

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': {}}}}
使用一些格式:

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

您不需要使用deque来迭代序列,您可以使用常规的pythoniterable。这可以让事情变得更加简洁

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()))

您不需要使用deque来迭代序列,您可以使用常规的pythoniterable。这可以让事情变得更加简洁

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()))

您的
不是有效的Python对象。可能是,我必须在发布之前检查它。”“树”是我从文件中读取后想要得到的。所以我自己手工做的,也许我犯了一些错误。我现在已经纠正了这棵树。感谢您的
不是有效的Python对象。可能是,我必须在发布之前检查它。”“树”是我从文件中读取后想要得到的。所以我自己手工做的,也许我犯了一些错误。我现在已经纠正了这棵树。非常感谢马克,这就是我要找的。输出的格式只是为了便于阅读。你的代码很有魅力。非常感谢马克,这就是我要找的。输出的格式只是为了便于阅读。你的代码工作起来很有魅力。这更简洁,并且给出了与上面代码相同的结果。非常感谢您的回答。这更加简洁,并且给出了与上面代码相同的结果。非常感谢你的回答。