python - mptt用于嵌套列表

0 投票
1 回答
556 浏览
提问于 2025-04-16 21:20

我稍微了解了一下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中使用这种格式有时可能会很有用,所以如果能有现成的代码就好了。

1 个回答

0

这个问题通过添加一个全局的迭代器解决了。

如果有人感兴趣的话,这就是新的 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() 这个部分没有变化。

撰写回答