我需要在Python中创建一个树状结构。我有一个函数get(parentId),它返回一个包含该父对象的对象列表 - 我认为这应该递归地完成。构建一棵树“向后”
结果应该是这样的:["root object", ["child1 of root", "child2 of root", ["child2-1", "child2-2"]]]
每个对象都有一个属性的父亲,这是是对的parentId的get(),但作为一个起点,我只有根对象。
我需要在Python中创建一个树状结构。我有一个函数get(parentId),它返回一个包含该父对象的对象列表 - 我认为这应该递归地完成。构建一棵树“向后”
结果应该是这样的:["root object", ["child1 of root", "child2 of root", ["child2-1", "child2-2"]]]
每个对象都有一个属性的父亲,这是是对的parentId的get(),但作为一个起点,我只有根对象。
假设你仍然对树的列表表示感兴趣(这不一定是无用的事情),这是一个递归函数定义,我相信你需要它(假设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
工程就像一个魅力:) – dom0 2012-04-15 11:28:31
有一个树的标准数据结构,它不是列表的列表。
创建一个类Node
,该属性的children
包含list
(或,如果您不关心顺序)子节点的属性。还要制作一个方法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)
走的树,只问了根的孩子,那么他们的孩子,等等。这可以递归来完成,但对速度和内存效率,你可能要反复做在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
。
我不能使用“其他”结构,因为数据源(get())和目标(列表的列表)。 ..)定义:( – dom0 2012-04-15 11:29:32
啊,够公平的,我误解了这个问题。 – katrielalex 2012-04-15 11:41:10
和你的问题是什么? – 2012-04-15 11:08:22
如何做到这一点。我很困难,但我需要尽快完成...;) – dom0 2012-04-15 11:10:03