2012-04-15 133 views
1

我需要在Python中创建一个树状结构。我有一个函数get(parentId),它返回一个包含该父对象的对象列表 - 我认为这应该递归地完成。构建一棵树“向后”

结果应该是这样的:["root object", ["child1 of root", "child2 of root", ["child2-1", "child2-2"]]]

每个对象都有一个属性的父亲,这是是对的parentId的get(),但作为一个起点,我只有根对象。

+0

和你的问题是什么? – 2012-04-15 11:08:22

+0

如何做到这一点。我很困难,但我需要尽快完成...;) – dom0 2012-04-15 11:10:03

回答

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 
+0

工程就像一个魅力:) – dom0 2012-04-15 11:28:31

1

有一个树的标准数据结构,它不是列表的列表。

创建一个类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.minidomlxml

+0

我不能使用“其他”结构,因为数据源(get())和目标(列表的列表)。 ..)定义:( – dom0 2012-04-15 11:29:32

+0

啊,够公平的,我误解了这个问题。 – katrielalex 2012-04-15 11:41:10