2012-05-13 6 views
0

私は数時間を費やしても、最高の結果を得ることができませんでした。しかし、タスクは非常に簡単ですが、私は何かが不足しているか、単に今日遅くなっているようです。設定パスでツリー構造を歩く機能

したがって、オブジェクトの単純なツリー構造があります。このような正式なルックスでのオブジェクト:

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

私はタプルのリストの形式で、すべてのノードのリストを出力walk関数を作成する必要があります。

pathは明らかへのパスです
for node in topNode.walk(): 
    path, object = node 

現在のノード(すなわち、/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

私はそれをパスのリストと "path"と "object"として返されたオブジェクトのリストと解釈しましたが、多分私は間違っています... – 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) 

EDIT

上記のあなたの編集に合わせて、return文を修正しました。

3

複合パスを取得するためにchildとしなければならないことを実行し、child.nameをwalkのパラメータとして渡します(これはキーワード引数でも可能です)。

のような...

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

ええ、私はあなたが開始した直後に質問を編集したと思います。 – ubik

+0

また、パスが単一の '/'で始まる方法はありません...しかし、そうでなければ良い解決策と思います。 – mgilson