我试图用Python实现一些基本的递归结构,但是没有成功。我有一个以嵌套列表形式表示的树,如下所示:ex = ['A',
['A1',
['A11', 'tag'],
['A12', 'tag'],
['A13',
['A131', 'tag'],
['A132',
['A1321', 'tag'],
['A1322', 'tag']]]],
['A2', 'tag'],
['A3',
['A31',
['A311', 'tag'],
['A312', 'tag']],
['A32', 'tag'],
['A33',
['A331',
['A3311', 'tag'],
['A3312', 'tag']]],
['A34', 'tag'],
['A35',
['A351', 'tag'],
['A352',
['A3521', 'tag'],
['A3522', 'tag']]]],
['A4', 'tag']]
我还定义了一个节点类,它允许指定一个标记'A', 'A1', ...并添加子项。可以通过注意children不是一个列表来检索终端节点。在
^{pr2}$
现在,我在实现将基于列表的树递归地转换为基于节点的树的函数时遇到了困难:tree = Node(tag='A',
children=[Node(tag='A1',
children=[Node(tag='A11',
children='tag'),
Node(tag='A12',
children='tag'),
...]),
...])
到目前为止,我的尝试是基于这样一种想法:在嵌套列表的每个位置,我们可能有一个终端节点,在这种情况下,我们只需将它添加到根节点,或者是一个非终端节点,在这种情况下,我们提取相应的根标记并递归地在子节点上迭代。当列表为空时,我们将控制权返回给调用方。
我的感觉是编码风格可能不是最适合Python的,但是我想更具体地知道我缺少什么。在def is_terminal(e):
return len(e) == 2 and type(e[0]) == str and type(e[1]) == str
def from_list(lst, root):
lst = list(lst) # avoid mutating input list
if not lst:
return
for e in lst:
if is_terminal(e):
tag, children = e
print "terminal", tag, "with root", root.tag
root.add_child(Node(tag=tag, children=children, parent=root))
else:
e = list(e)
tag, children = e.pop(0), e
print "non terminal", tag, "with root", root.tag
root = Node(tag=tag, parent=root)
from_list(children, root=root)
它有很多问题。例如,它失去了对最高根'A'的跟踪,即A2得到{}作为根。它还将树展平到一个有16个子节点的节点,每个终端节点一个子节点,并进入无限递归。
我希望你能给我任何提示。在