初学者Python /编程问题...我想在Python中构建一个树结构,最好是基于字典。我发现代码可以做到这一点:
Tree = lambda: collections.defaultdict(Tree)
root = Tree()
这很容易填充如下:
root['toplevel']['secondlevel']['thirdlevel'] = 1
root['toplevel']['anotherLevel'] = 2
...etc.
我想动态填充关卡/叶子,以便我可以根据需要添加任意数量的关卡,以及叶子在任何级别的位置。我该怎么做?
非常感谢任何帮助。
答案 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
我希望这会给你一个想法。