从预期的文本字符串构建树

时间:2016-03-16 08:46:42

标签: python django recursion tree

我有一个代表django中简单树节点的模型:

class Node(models.Model):
    name = models.CharField('Name')
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children')

我有一个文档,它由一个树形结构组成,用于标签,如下所示:

Level1.1
    Level2.1
    Level2.2
        Level3
Level1.2

当我解析这个文档时,我有以下字符串:

'Level1.1\n\tLevel2.1\n\tLevel2.2\n\t\tLevel3\nLevel1.2'

如何有效地解析此字符串并创建节点?结果应该是:

Node(name='Level1.1'), Node(name='Level2.1', parent=Node(previous node)) etc.

提前致谢!

1 个答案:

答案 0 :(得分:1)

使用堆栈跟踪父节点。

document = 'Level1.1\n\tLevel2.1\n\tLevel2.2\n\t\tLevel3\nLevel1.2'

stack = []  # keep track of ancestors ([0] - root, ..., [-1] - parent)
for line in x.splitlines():
    name = line.strip()
    level = line.count('\t')
    while len(stack) > level:
        stack.pop()
    node = Node(name=name, parent=stack[-1] if stack else None)
    node.save()
    stack.append(node)