2012-04-15 139 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