繁体   English   中英

如何在Python中动态构建树

[英]How do I build a tree dynamically in 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)

啊哈! 当我开始编码时,这对我来说是一个问题,但我们中最好的人早就遇到了这个问题。

注意; 这是为了你的树深入N级。 其中N介于0和无穷大之间,即; 你不知道它有多深; 它可能只有第一级,或者可能达到第20级

你的问题是一般的编程问题; 在树中读取可以是任何数量级别的树,解决方案是这样的; 递归。

每当阅读树形结构时,你必须;

1 - 构建对象2 - 检查对象是否有子项2a - 如果对象有子项,则为每个子项执行步骤1和2。

这是python中用于执行此操作的代码模板;

def buildTree(treeObject):
   currObject = Hierarchy()
   currObject.name = treeObject.getName()
   currObject.age = treeObject.getAge()
   #as well as any other calculations and values you have to set for that object

   for child in treeObject.children:
      currChild = buildTree(child)
      currObject.addChild(currChild)
   #end loop

   return currObject

这个

root['toplevel']['secondlevel']['thirdlevel'] = 1

也可以这样做:

node = root
for key in ('toplevel', 'secondlevel'):
    node = node[key]
node['thirdlevel'] = 1

我希望能给你一个想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM