[英]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.