【问题标题】:python - mptt for nested listspython - 用于嵌套列表的 mptt
【发布时间】:2011-07-12 12:32:48
【问题描述】:

我已经阅读了一些关于 mptt 解决方案的内容,并且正在尝试实现某种将嵌套列表转换为 mptt 列表的方法。我知道,在这种格式下它是没用的,但嵌套列表可以很容易地用子类或其他任何东西进行更改。

我的代码是:

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

我发现递归中的正确值有些问题。我认为 python 中的这种格式有时可能很有用,所以最好有一些已经编写的代码。

【问题讨论】:

    标签: python recursion mptt


    【解决方案1】:

    问题已通过添加全局迭代器解决。

    如果有人感兴趣,那就是新的 numerate 函数,它实际上可以正常工作。

    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() 不变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多