2012-05-13 82 views
0

我花了幾個小時,仍然無法獲得最佳效果。然而,這項任務非常簡單,但似乎我錯過了一些東西,或者今天簡單地放慢了速度。設置路徑沿着樹形結構行走的功能

因此,我們有一個簡單的樹形結構的對象。在正式的外觀對象是這樣的:

node: 
    name {str} 
    value {str} 
    children {list} 
     node, 
     node, 
     ... 

我需要創建walk功能輸出的元組的列表格式的所有節點列表:

for node in topNode.walk(): 
    path, object = node 

其中path顯然是一個路徑當前節點(即/name/name)。功能與os.walk()功能幾乎相同。

在我的卡我用這段代碼的時刻:

def walk(self): 
    result = [] 
    for child in self.children: 
     result.append(child) 
     result.extend(child.walk()) 
    return result 

如何在這裏補充path

感謝您的幫助!

+0

我以你希望的東西輸出稍微困惑。 –

+0

確實。我今天肯定很慢。更新。 – VisioN

+0

我將它解釋爲分別作爲「路徑」和「對象」返回的路徑列表和對象列表......但也許我錯了...... – mgilson

回答

1

這可能會實現 - 我做它在我的頭,還沒有測試它...

def walk(self,_root='/'): 
    result=[] 
    for child in self.children: 
     path="%s%s/"%(_root,child.name) if child.children else "%s%s"%(_root,child.name) 
     result.append((path,child)) 
     result.extend(child.walk(_root=path)) 

    return result #result if _root != '/' else zip(*result) 

編輯

固定return語句來匹配你上面的編輯。

3

凡是你必須爲了得到複合路徑,然後在child.name傳爲步行的參數(它甚至可以是一個關鍵字參數)與child做的事。

喜歡的東西...

def walk(self, path=''): 
    result = [] 
    for child in self.children: 
     child_path = path + '/' + child.name 
     result.append((child_path, child)) 
     result.extend(child.walk(child_path)) 
    return result 
+0

這不會解開它應有的方式但它基本上與我使用的是相同的想法,所以我想也許這是一個有效的方法...... – mgilson

+0

是的,我猜OP在您開始後編輯了問題。 – ubik

+0

此外,沒有辦法根據需要以單個「/」開始路徑......但我認爲這是一個很好的解決方案。 – mgilson