gpt4 book ai didi

python - 在python中将字符串转换为树结构

转载 作者:太空狗 更新时间:2023-10-30 01:07:17 24 4
gpt4 key购买 nike

我在 python 中有一个如下形式的字符串:

line a
line b
line ba
line bb
line bba
line bc
line c
line ca
line caa
line d

你可以明白这一点。它实际上采用与 python 代码本身非常相似的形式,因为有一行,在该行下方,缩进表示 block 的一部分,以最近的较小缩进行开头。

我需要做的是将这段代码解析成一个树结构,这样每个根级别的行都是一个字典的键,它的值是一个代表所有子行的字典。所以上面的内容是:

{
'line a' => {},
'line b' => {
'line ba' => {},
'line bb' => {
'line bba' => {}
},
'line bc' => {}
},
'line c' => {
'line ca' => {
'line caa' => {}
},
},
'line d' => {}
}

这是我得到的:

def parse_message_to_tree(message):
buf = StringIO(message)
return parse_message_to_tree_helper(buf, 0)

def parse_message_to_tree_helper(buf, prev):
ret = {}
for line in buf:
line = line.rstrip()
index = len(line) - len(line.lstrip())
print (line + " => " + str(index))
if index > prev:
ret[line.strip()] = parse_message_to_tree_helper(buf, index)
else:
ret[line.strip()] = {}

return ret

打印显示被剥离的行和索引为 0。我不认为 lstrip() 是一个突变器,但无论哪种方式,索引应该仍然是准确的。

任何建议都是有帮助的。

编辑:不确定之前出了什么问题,但我再次尝试并且它更接近工作,但仍然不太正确。这是我现在拥有的:

{'line a': {},
'line b': {},
'line ba': {'line bb': {},
'line bba': {'line bc': {},
'line c': {},
'line ca': {},
'line caa': {},
'line d': {}}}}

最佳答案

正如之前已经指出的那样,str.lstrip() 不是突变器,索引在我的系统中也变得准确了。

但问题是,当您意识到该行的索引增加时,line 实际上指向增加的索引行,例如,在第一种情况下,我们注意到索引为line 在 line ba 增加,所以 line 指向 line ba ,然后在你的 if 条件下,你做-

ret[line.strip()] = parse_message_to_tree_helper(buf, index)

这是错误的,因为您会将 parse_message_to_tree_helper() 返回的任何内容设置为 line ba,而不是其实际父级。

此外,一旦你在函数内部递归,除非文件被完全读取,否则你不会出来,但是当缩进减少时,某一行在字典中的存储级别取决于它从递归中出来。

我不确定是否有任何内置库可以帮助您执行此操作,但是我能够想出一个代码(很大程度上基于您的代码)-

def parse_message_to_tree(message):
buf = StringIO(message)
return parse_message_to_tree_helper(buf, 0, None)[0]

def parse_message_to_tree_helper(buf, prev, prevline):
ret = {}
index = -1
for line in buf:
line = line.rstrip()
index = len(line) - len(line.lstrip())
print (line + " => " + str(index))
if index > prev:
ret[prevline.strip()],prevline,index = parse_message_to_tree_helper(buf, index, line)
if index < prev:
return ret,prevline,index
continue
elif not prevline:
ret[line.strip()] = {}
else:
ret[prevline.strip()] = {}
if index < prev:
return ret,line,index
prevline = line
if index == -1:
ret[prevline.strip()] = {}
return ret,None,index
if prev == index:
ret[prevline.strip()] = {}
return ret,None,0

示例/演示 -

>>> print(s)
line a
line b
line ba
line bb
line bba
line bc
line c
line ca
line caa
>>> def parse_message_to_tree(message):
... buf = StringIO(message)
... return parse_message_to_tree_helper(buf, 0, None)[0]
...
>>> def parse_message_to_tree_helper(buf, prev, prevline):
... ret = {}
... index = -1
... for line in buf:
... line = line.rstrip()
... index = len(line) - len(line.lstrip())
... print (line + " => " + str(index))
... if index > prev:
... ret[prevline.strip()],prevline,index = parse_message_to_tree_helper(buf, index, line)
... if index < prev:
... return ret,prevline,index
... continue
... elif not prevline:
... ret[line.strip()] = {}
... else:
... ret[prevline.strip()] = {}
... if index < prev:
... return ret,line,index
... prevline = line
... if index == -1:
... ret[prevline.strip()] = {}
... return ret,None,index
... if prev == index:
... ret[prevline.strip()] = {}
... return ret,None,0
...
>>> pprint.pprint(parse_message_to_tree(s))
line a => 0
line b => 0
line ba => 2
line bb => 2
line bba => 4
line bc => 2
line c => 0
line ca => 2
line caa => 4
{'line a': {},
'line b': {'line ba': {}, 'line bb': {'line bba': {}}, 'line bc': {}},
'line c': {'line ca': {'line caa': {}}}}
>>> s = """line a
... line b
... line ba
... line bb
... line bba
... line bc
... line c
... line ca
... line caa
... line d"""
>>> pprint.pprint(parse_message_to_tree(s))
line a => 0
line b => 0
line ba => 2
line bb => 2
line bba => 4
line bc => 2
line c => 0
line ca => 2
line caa => 4
line d => 0
{'line a': {},
'line b': {'line ba': {}, 'line bb': {'line bba': {}}, 'line bc': {}},
'line c': {'line ca': {'line caa': {}}},
'line d': {}}

您需要测试代码是否有更多错误或遗漏的案例。

关于python - 在python中将字符串转换为树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32101253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com