2011-07-03 7 views
0

私はクラスTestのインスタンスのリストを持っています。最初の引数は名前、第二の親であるネストされたリストから文字列へ

[Test('a', ''), Test('b', ''), Test('c', 'a'), Test('d', 'a'), Test('e', 'c')] 

nameのようにして parentこのクラスは、メソッドを持っています。親argは単に親クラスのarg nameです。 私のような文字列にこのリストを変換したい:私は文字列にこのリストを変換するための最もCPU対効果の高い方法を探して

Test('a', '') 
    |-- Test('c', 'a') 
     |-- Test('e', 'c') 
    |-- Test('d', 'a') 
Test('b', '') 

。リスト内の項目は、倍数(10,100,1000、..)のレベルでネストすることができ、使用するメモリは気にしません。

+0

あなたが立ち往生している特定の質問やスポットがありますか?これまでに試したことがあるコードを投稿してエラーを表示することができますか、またはベストソリューションの考えを探していますか? –

+0

編集されました。申し訳ありませんが、私はコードやCPUアイデアを効率的に作成するためのアイデアを探しています。 – Galmi

答えて

2

ここは、そのまま動作するコードです。基本的には(あなたが望む場合は、反復DFSを使用することができます)ツリーに配列を変換し、それを印刷するには、再帰的なDFSを使用します。

class Test: 
    def __init__(self, name, parent): 
     self.name = name 
     self.parent = parent 
    def __repr__(self): 
     return "Test('"+self.name+"', '"+self.parent+"')" 



li = [Test('a', ''), Test('b', ''), Test('c', 'a'), Test('d', 'a'), Test('e', 'c')] 

dict = {"":(None,[])} #name to (node,children) 
#add nodes 
for item in li: 
    dict[item.name] = (item, []) 
#add children 
for item in li: 
    dict[item.parent][1].append(dict[item.name]) 

def printTree(dict, name, indent): 
    newIndent=indent 
    if name!="": 
     print(indent + str(dict[name][0])) 
     if indent == "": newIndent=" |-- " 
     else: newIndent = "  "+indent 
    for child in dict[name][1]: 
     printTree(dict, child[0].name, newIndent) 


printTree(dict, "", "") 
+0

各アイテムへのN参照を作成します(Nは深度です)。そのコードは大きな入力に悪いです... –

+0

いいえ、私は...なぜあなたはそう思いますか? –

+0

あなたは '' ':[a:[c:e、d]、b]、a:[c:e、d]、b、c:e、d、e} ' –

0

あなたはそのように、別の容器を使用する必要があります。

def show(x, indent=0): 
    for i in x: 
     print('\t'*indent + 'Test(%r)' % i.name) 
     show(i.sub, indent+1) 

show(elements) 

を印刷する必要があります:

Test('a') 
    Test('c') 
     Test('e') 
    Test('d') 
Test('b') 

あなたはにインデントを変更することがあり

class Test: 
    def __init__(self, name, sub=None): 
     self.name = name 
     self.sub = sub if sub is not None else [] 

elements = [Test('a', [Test('c', [Test('e')]), Test('d')]), Test('b')] 

そしてちょうど印刷にelementsを繰り返しますあなたが好むもの(私はタブを使用しています)。

0

ドル紙幣は、あなたが

import networkx as nx 
stuff=[('a', ''), ('b', ''), ('c', 'a'), ('d', 'a'), ('e', 'c')] 
G=nx.DiGraph() 
for i in stuff: 
    G.add_edge(i[1],i[0]) 
print G.adj 
をnetworkx使用することができます示唆したように、あなたがDFSを使用して終了した場合

それでは、DFSでそれを繰り返すのです

関連する問題