2014-01-24 109 views
2

初學Python /編程問題...我想在Python中構建樹結構,最好基於字典。我發現代碼,這是否整齊:需要如何在Python中動態構建樹

root['toplevel']['secondlevel']['thirdlevel'] = 1 
root['toplevel']['anotherLevel'] = 2 
...etc. 

我想填充/動態離開的水平,這樣我可以添加多個層次:

Tree = lambda: collections.defaultdict(Tree) 
root = Tree() 

這可以很容易地填充像,葉子可以在任何級別。我怎麼做?

任何幫助,非常感謝。

+0

您可以照原樣使用此代碼。您可以根據需要添加儘可能多的級別。你的問題到底是什麼? – thefourtheye

+0

我不知道我有多少級別,所以我想能夠動態添加它們而不是硬編碼 – user252652

+0

這是遞歸的人,你有沒有試過我的答案?您只需將對象類型從標準對象更改爲字典 – pythonian29033

回答

4

你可以簡單地用一個效用函數做到這一點,像這樣

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中除去第一個元素,以進行下一次迭代。

def add_element(root, path, data): 
    if len(path) == 1: 
     root[path[0]] = data 
    else: 
     add_element(root[path[0]], path[1:], data) 
+0

這有助於非常感謝。但是如果我想逐個構建關卡,該怎麼辦?也就是說,事實上我並沒有真正擁有所有的參賽者。我想建立第一級,如果我有一個孩子節點,建立另一個級別,...等等。 – user252652

+0

他需要一個遞歸函數man,檢查問題中的標籤,我認爲他需要指導如何構建一個使用遞歸深入N層的對象樹。你有23.4k代表,你是這方面的專家 – pythonian29033

+1

@ pythonian29033我只是設法給一個基本的遞歸版本,請檢查:) – thefourtheye

0

root['toplevel']['secondlevel']['thirdlevel'] = 1 

也可以做這樣的:

node = root 
for key in ('toplevel', 'secondlevel'): 
    node = node[key] 
node['thirdlevel'] = 1 

我希望給你一個想法。

1

啊!當我開始編寫代碼時,這對我來說也是一個問題,但是我們最好的人早就遇到了這個問題。

注意;這是爲了當你的樹進入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