给出了每个子列表标识分支的节点列表列表。 目标是编写一个python程序来重建这些分支中的树。 “分支”是指从树的根开始到叶子结束的列表。我们假设主列表具有以下形式:
branches = [b_1 , b_2 , b_3 , ... , b_n]
这里的分支数等于叶n
的数量。每个分支按顺序包含从树的根到叶子的节点列表:
b_i = [root,n_1,n_2,n_3,...,leaf_i]
目标是将所有列表合并到一个捕获树结构的字典中。每个节点应该有两个键值对:name和children。 name的值是节点的名称,子节点的值是节点列表(具有名称和子节点的字典)。 没有这种特殊结构,这个问题与How to turn a list into nested dict in Python
非常相似例如,如果列表是:
branches=[[root,n1,l1],[root,n1,l2],[root,n2,l3],[root,n2,l4]]
我们正在寻找像这样的字典:
treeDict = {'name':root,'children':
[
{'name':n1,'children':[
{'name':l1,'children':[]},
{'name':l2,'children':[]}]},
{'name':n2,'children':[
{'name':l3,'children':[]},
{'name':l4,'children':[]}]}
]
}
代表这棵树:
root
/ \
n1 n2
/ \ / \
l1 l2 l3 l4
答案 0 :(得分:1)
这是使用dict上的一些递归来实现它的一种方法:
import pprint
def traverse(root, branch):
if not branch:
return
if branch[0] not in root:
root[branch[0]] = {}
traverse(root[branch[0]], branch[1:])
# Or rather, uglify
def prettify(root):
res = []
for k, v in root.iteritems():
d = {}
d['name'] = k
d['children'] = prettify(v)
res.append(d)
return res
d = {}
branches = [['root','n1','l1'],['root','n1','l2'],['root','n2','l3'],['root','n2','l4']]
for b in branches:
traverse(d, b)
pprint.pprint(d)
pprint.pprint(prettify(d))
输出:
# The compact representation
{'root': {'n1': {'l1': {}, 'l2': {}}, 'n2': {'l3': {}, 'l4': {}}}}
# The desired representation
[{'children': [{'children': [{'children': [], 'name': 'l2'},
{'children': [], 'name': 'l1'}],
'name': 'n1'},
{'children': [{'children': [], 'name': 'l4'},
{'children': [], 'name': 'l3'}],
'name': 'n2'}],
'name': 'root'}]