如何在Python中动态构建树


问题内容

Python /编程初学者的问题…我想在Python中建立树形结构,最好基于字典。我发现可以很好地做到这一点的代码:

Tree = lambda: collections.defaultdict(Tree)
root = Tree()

可以很容易地填充为:

 root['toplevel']['secondlevel']['thirdlevel'] = 1
 root['toplevel']['anotherLevel'] = 2
 ...etc.

我想动态填充级别/叶子,以便我可以根据需要添加任意多个级别,并且叶子可以位于任何级别。我怎么做?

任何帮助是极大的赞赏。


问题答案:

您可以使用实用程序功能轻松完成此操作

def add_element(root, path, data):
    reduce(lambda x, y: x[y], path[:-1], root)[path[-1]] = data

可以这样使用

import collections
tree = lambda: collections.defaultdict(tree)
root = tree()
add_element(root, ['toplevel', 'secondlevel', 'thirdlevel'], 1)
add_element(root, ['toplevel', 'anotherlevel'], 2)
print root

输出量

defaultdict(<function <lambda> at 0x7f1145eac7d0>,
    {'toplevel': defaultdict(<function <lambda> at 0x7f1145eac7d0>,
       {'secondlevel': defaultdict(<function <lambda> at 0x7f1145eac7d0>,
            {'thirdlevel': 1}),
        'anotherlevel': 2
       })
    })

如果要以递归方式实现此功能,则可以获取第一个元素并从当前元素中获取子对象,root并从中剥离第一个元素path,以进行下一次迭代。

def add_element(root, path, data):
    if len(path) == 1:
        root[path[0]] = data
    else:
        add_element(root[path[0]], path[1:], data)