Python:从文本文件中读取树状数据并存储在字典中
我有一个文本文件,其中包含类似于树的数据,由一个空格分隔,结构如下: “分支数”“节点名称”。。。0(0表示不再有分支) 例如: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': {
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对象。可能是,我必须在发布之前检查它。”“树”是我从文件中读取后想要得到的。所以我自己手工做的,也许我犯了一些错误。我现在已经纠正了这棵树。非常感谢马克,这就是我要找的。输出的格式只是为了便于阅读。你的代码很有魅力。非常感谢马克,这就是我要找的。输出的格式只是为了便于阅读。你的代码工作起来很有魅力。这更简洁,并且给出了与上面代码相同的结果。非常感谢您的回答。这更加简洁,并且给出了与上面代码相同的结果。非常感谢你的回答。