2011-07-12 11 views
0

私はmpttの解決策について少しお読みになり、入れ子リストをmpttリストに翻訳するような実装をしようとしています。私は知っています、このフォーマットでは無駄ですが、ネストされたリストはクラスの子や他のもので簡単に変更することができます。python-mptt for nested lists

tree = [[1,[[11,[111, 112, 113]],[12,]]],[2,[[21,[[211,[2111,]],]],]]] 

class node(): 
    def __init__(self, value, lft): 
     self.value = value 
     self.lft = lft 

    def add_right(self, rgt): 
     self.rgt = rgt 

    def __str__(self): 
     return "%s | %s | %s" %(self.value, self.lft, self.rgt) 

def numerate(table, tree, counter): 
    for item in tree: 
     if type(item) == type(1): 
      table.append(node(item, counter)) 
      index = len(table) 
      counter += 1 
     else: 
      table.append(node(item[0], counter)) 
      index = len(table) 
      counter += 1 

      if len(item) > 1: 
       (table, counter) = numerate(table, item[1], counter) 

     table[index-1].add_right(counter) 
    return (table, counter) 

table = numerate([], tree, 0)[0] 

for item in table: 
    print item 

しかし、結果は次のとおりです:

私が持っているコードがある

1 | 0 | 6 
11 | 1 | 5 
111 | 2 | 3 
112 | 3 | 4 
113 | 4 | 5 
12 | 5 | 6 
2 | 6 | 10 
21 | 7 | 10 
211 | 8 | 10 
2111 | 9 | 10 

私は再帰で正しい値でOKではない何かがそこにある参照してください。私は、このような形式のPythonを使うと便利かもしれないと思うので、既に書かれているコードをいくつか持っているといいでしょう。

答えて

0

問題は、グローバルイテレータを追加することによって解決されました。

誰かが興味を持っているのであれば、それは実際にうまく動作する新しい数値関数です。

global_iterator = 0 

def numerate(table, tree): 
    global global_iterator 
    for item in tree: 
     global_iterator += 1 


     if type(item) == type(1): 
      table.append(node(item, global_iterator)) 
      index = len(table) 
     else: 
      table.append(node(item[0], global_iterator)) 
      index = len(table) 

      if len(item) > 1: 
       table.append(numerate(table, item[1])) 

     global_iterator += 1 

     table[index-1].add_right(global_iterator) 

    return table 

table = numerate([], tree) 

node()は変更されません。