我需要在Python中创建一个类似树的结构。我有一个函数get(parentId),它返回一个包含该父对象的对象列表 - 我认为应该以递归方式完成。
结果应该是这样的:["root object", ["child1 of root", "child2 of root", ["child2-1", "child2-2"]]]
每个对象都有一个parent属性,它是get()的parentId,但作为一个起点,我只有root对象。
答案 0 :(得分:1)
树有一个标准数据结构,它不是列表列表。
制作一个课程Node
,其中包含children
的属性list
(或set
,如果您不关心顺序)“子节点” 。还要创建一个方法add_child
,它接受一个节点,设置该节点的parent
,并将其添加到children
列表中。类似的东西:
class Node(object):
def __init__(self, children={}):
self.parent = None
self.children = children
def add_child(self, child):
child.parent = self
self.children.add(child)
要走树,只需要询问root的子项,然后是子项等。这可以递归完成,但为了提高速度和内存效率,您可能希望在Python中迭代执行。
def walk(root):
yield root
for child in root.children:
for elt in walk(child):
yield elt
当然,这已经做过很多次了,所以你不应该自己写,除非是作业或学习练习。
由于HTML / XML文档的结构类似于树,因此您应该使用众多DOM树库中的一个作为实际数据结构。试试xml.dom.minidom
或lxml
。
答案 1 :(得分:1)
假设你仍然对树的列表表示感兴趣(这不一定是无用的事情),这是一个递归函数定义,我相信你需要做的事情(假设get()
函数确实已经定义过:)
def build_tree(node):
return [node,[build_tree(child) for child in get(node)]]
你可以用类似的方式使用它:
root = 1 # or whatever other representation you may use for root
list = build_tree(root)
print list