使用python解析树

2024-04-19 07:50:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须做一个程序来解析一个用括号和数字表示的树。因此,每个圆括号表示树中的节点,程序应该打印出每个父节点的所有子节点。python代码如下:

class context(object):
    def __init__(self, label=None, parent=None, children=[]):
        self.label = label
        self.parent = parent
        self.children = []
        self.list = []

    def make_tree(self, tree):
        stack = []
        index = 0
        while index < len(tree):
            if tree[index] is '(':
                if self.label is None:
                    self.label = tree[index+1]
                    index = index+1
                else:
                    if len(stack) == 0:
                        stack.append(context(tree[index+1], self.label))
                        index = index+1
                    else:
                        stack.append(context(tree[index+1], stack[len(stack)-1].label))
                        index = index+1

            elif tree[index] is ')':
                if len(stack) == 1:
                    self.children.append(stack.pop())
                    return
                else:
                    stack[len(stack)-2].children.append(stack.pop())
            index = index+1

    def traverse(self, size, obj):
        if self.label is None or size == 0:
            return []
        temp_list = []
        temp = []
        dic = {}
        tt = [children.label for children in obj.children]
        dic[obj.label] = tt
        temp.append(dic)
        for child in obj.children:
            temp_list = child.traverse(len(child.children), child)
        print temp
        return temp + temp_list


line =  '( Root ( 1 ( 2 )  ( 3 ( 4 )  ( 5 )  )  ( 6 ( 7 )  ( 8 ( 9 )  )  )  )  ) '.split()
test = context()
test.make_tree(line)
final = test.traverse(len(test.children), test)

结果一定是这样。 Result

如果我在make_tree函数中打印出列表,我会得到正确的结果。。。但最终的结果并不正确。在本例中,我缺少{3':['4','5']} final result

有什么意见吗??你知道吗


Tags: testselfnonetreeindexlenifis
2条回答

如果将子结果的赋值覆盖到临时列表,则可能需要执行以下操作:

for child in obj.children:
    temp_list += child.traverse(len(child.children), child)

我刚看了你的一些代码。它没有太多的时间,所以我不可能真正调试它的方式更多,但你也可以实现有tmpList的方式属于和基本上保持更新在每一点。Alko的解决方案同样有效,但这可能更清楚一些。你知道吗

def traverse(self, size, obj, tmpList):
    if self.label is None or size == 0:
        return []
    dic = {}
    tt = [children.label for children in obj.children]
    dic[obj.label] = tt
    tmpList.append(dic)
    for child in obj.children:
        child.traverse(len(child.children), child, tmpList)
    return tmpList

你称之为:

final = test.traverse(len(test.children), test, [])

相关问题 更多 >