Python 将嵌套括号树转换为嵌套列表
我有一个树结构文件,其中括号用于表示树。下面是将其转换为python嵌套列表的代码Python 将嵌套括号树转换为嵌套列表,python,Python,我有一个树结构文件,其中括号用于表示树。下面是将其转换为python嵌套列表的代码 def foo(s): def foo_helper(level=0): try: token = next(tokens) except StopIteration: if level != 0: raise Exception('missing closing paren')
def foo(s):
def foo_helper(level=0):
try:
token = next(tokens)
except StopIteration:
if level != 0:
raise Exception('missing closing paren')
else:
return []
if token == ')':
if level == 0:
raise Exception('missing opening paren')
else:
return []
elif token == '(':
return [foo_helper(level+1)] + foo_helper(level)
else:
return [token] + foo_helper(level)
tokens = iter(s)
return foo_helper()
根据
在这里,当字符长度为1时,它可以正常工作。对于单词或句子,同样的方法不能正常工作。
我的树木样本是:
( Satellite (span 69 74) (rel2par Elaboration)
( Nucleus (span 69 72) (rel2par span)
( Nucleus (span 69 70) (rel2par span)
( Nucleus (leaf 69) (rel2par span) (text _!MERRILL LYNCH READY ASSETS TRUST :_!) )
( Satellite (leaf 70) (rel2par Elaboration) (text _!8.65 % ._!) )
)
( Satellite (span 71 72) (rel2par Elaboration)
( Nucleus (leaf 71) (rel2par span) (text _!Annualized average rate of return_!) )
( Satellite (leaf 72) (rel2par Temporal) (text _!after expenses for the past 30 days ;_!) )
)
)
( Satellite (span 73 74) (rel2par Elaboration)
( Nucleus (leaf 73) (rel2par span) (text _!not a forecast_!) )
( Satellite (leaf 74) (rel2par Elaboration) (text _!of future returns ._!) )
)
)
这里,输出需要
['satellite',['span','69','74']…]
但是对于给定的函数,我得到的是['s','a','t'…['s','p','a','n','7','3']…]
如何修改此函数?您不打算在字符串本身上调用此函数,而是在标记列表上调用此函数,即字符串
拆分
:
def parse(s):
def parse_helper(level=0):
try:
token = next(tokens)
except StopIteration:
if level:
raise Exception('Missing close paren')
else:
return []
if token == ')':
if not level:
raise Exception('Missing open paren')
else:
return []
elif token == '(':
return [parse_helper(level+1)] + parse_helper(level)
else:
return [token] + parse_helper(level)
tokens = iter(s)
return parse_helper()
if __name__ == '__main__':
with open('tree.thing', 'r') as treefile:
tree = treefile.read()
print(parse(tree.split()))
当treefile
包含您发布的数据结构时,我得到以下输出:
[['Satellite', '(span', '69', '74)', '(rel2par', 'Elaboration)', ['Nucleus', '(span', '69', '72)', '(rel2par', 'span)', ['Nucleus', '(span', '69', '70)', '(rel2par', 'span)', ['Nucleus', '(leaf', '69)', '(rel2par', 'span)', '(text', '_!MERRILL', 'LYNCH', 'READY', 'ASSETS', 'TRUST', ':_!)'], ['Satellite', '(leaf', '70)', '(rel2par', 'Elaboration)', '(text', '_!8.65', '%', '._!)']], ['Satellite', '(span', '71', '72)', '(rel2par', 'Elaboration)', ['Nucleus', '(leaf', '71)', '(rel2par', 'span)', '(text', '_!Annualized', 'average', 'rate', 'of', 'return_!)'], ['Satellite', '(leaf', '72)', '(rel2par', 'Temporal)', '(text', '_!after', 'expenses', 'for', 'the', 'past', '30', 'days', ';_!)']]], ['Satellite', '(span', '73', '74)', '(rel2par', 'Elaboration)', ['Nucleus', '(leaf', '73)', '(rel2par', 'span)', '(text', '_!not', 'a', 'forecast_!)'], ['Satellite', '(leaf', '74)', '(rel2par', 'Elaboration)', '(text', '_!of', 'future', 'returns', '._!)']]]]
我假设您想使用
来表示带空格的字符串代码>。然后,我使用正则表达式拆分表达式:
from re import compile
resexp = compile(r'([()]|_!)')
…
tokens = iter(resexp.split(s))
…
我的结果是(使用深度为4的pprint)
我对它进行了进一步的改进:
tokens = iter(filter(None, (i.strip() for i in resexp.split(s))))
得到:
$ python lispparse.py
[['Satellite',
['span 69 74'],
['rel2par Elaboration'],
['Nucleus',
['span 69 72'],
['rel2par span'],
['Nucleus', [...], [...], [...], [...]],
['Satellite', [...], [...], [...], [...]]],
['Satellite',
['span 73 74'],
['rel2par Elaboration'],
['Nucleus', [...], [...], [...]],
['Satellite', [...], [...], [...]]]]]
看一看这个问题:只是一个简单的问题,没有读到OPs的问题:foo_helper
knowtokens
?我本以为会出现namererror
,因为tokens
是在foo\u helper
的定义下面定义的@SteinarLima看看我的答案,格式稍微好一点。它是一个内部函数,基本上直到foo
的最后一行才被调用。请注意,parse
和parse\u helper
刚刚从OP中的foo
和foo\u helper
重命名。是的,我知道这一点,但问题是“!MERRILL、LYNCH、READY、ASSETS、TRUST、
我需要将其显示为单个项目元素,如“!美林就绪资产信托公司
是的,我正在调整代码。请继续关注最新消息。啊,暴风雨正在干扰我的互联网连接。tl;dr这段代码很难改进,现在我无法处理它,所以您应该研究(或使用其他答案)。
$ python lispparse.py
[['Satellite',
['span 69 74'],
['rel2par Elaboration'],
['Nucleus',
['span 69 72'],
['rel2par span'],
['Nucleus', [...], [...], [...], [...]],
['Satellite', [...], [...], [...], [...]]],
['Satellite',
['span 73 74'],
['rel2par Elaboration'],
['Nucleus', [...], [...], [...]],
['Satellite', [...], [...], [...]]]]]