从分支列表重建树

时间:2014-11-05 05:11:36

标签: python list python-2.7 dictionary tree

给出了每个子列表标识分支的节点列表列表。 目标是编写一个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

1 个答案:

答案 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'}]