如何在Python中动态构建树

use*_*652 3 python recursion dictionary

初学者Python /编程问题......我想在Python中构建一个树结构,最好是基于字典.我发现代码可以做到这一点:

Tree = lambda: collections.defaultdict(Tree)
root = Tree()
Run Code Online (Sandbox Code Playgroud)

这很容易填充如下:

 root['toplevel']['secondlevel']['thirdlevel'] = 1
 root['toplevel']['anotherLevel'] = 2
 ...etc.
Run Code Online (Sandbox Code Playgroud)

我想动态填充级别/叶子,以便我可以根据需要添加任意数量的级别,以及叶子可以在任何级别的位置.我怎么做?

任何帮助是极大的赞赏.

the*_*eye 5

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

def add_element(root, path, data):
    reduce(lambda x, y: x[y], path[:-1], root)[path[-1]] = data
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它

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

产量

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

如果要以递归方式实现它,可以获取第一个元素并从当前获取子对象,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)
Run Code Online (Sandbox Code Playgroud)

  • @ pythonian29033我刚设法给出一个基本的递归版请检查:) (2认同)