如何在Python中动态构建树

时间:2014-01-24 09:25:33

标签: python recursion dictionary

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

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

这很容易填充如下:

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

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

您只需使用实用功能即可,例如

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中剥离第一个元素,以进行下一次迭代。 / p>

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

答案 1 :(得分:1)

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

请注意;这是为了你的树深入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

答案 2 :(得分:0)

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

也可以这样做:

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

我希望这会给你一个想法。