我有一个文本输入,格式是-
var="""
interface A
member-1
member-2
submember-1
submember-2
interface B
member-1
interface C
"""我将不得不将其转换为如下所示的python嵌套字典形式。另外,任何没有子成员的元素都将被赋值为-1。
result=
{
'interface A':{'member-1': -1 ,'member-2':{'submember-1': -1,'submember-2': -1}}
'interface B' :{'member-1': -1},
'interface C': -1
}我试着用递归的方式来做,但是我的逻辑似乎不正确。要做到这一点,最好的方法是什么?
发布于 2015-10-19 09:11:53
这有点难看,但是如果你没有太多的缩进级别,这段代码会很有用
_dict = {}
for line in var.split('\n'):
if line.strip():
print line
leading_spaces = len(line) - len(line.lstrip())
if leading_spaces == 0:
interface = line.strip()
_dict[interface] = -1
elif leading_spaces == 2:
member = line.strip()
if _dict[interface] == -1:
_dict[interface] = {member:-1}
else:
_dict[interface].update({member:-1})
elif leading_spaces == 4:
print _dict
submember = line.strip()
if _dict[interface][member] == -1:
_dict[interface][member] = {submember:-1}
else:
_dict[interface][member].update({submember:-1})发布于 2015-10-19 13:10:45
对于这样的事情,递归是一个很好的策略,尽管有一点复杂,因为a)您必须跟踪当前正在处理的输入字符串中的哪一行,以及b)您必须向前看并查看未来行的缩进级别,以确定特定的递归调用何时应该返回。
一种解决方案是使用一个生成器来获取连续的行,并使用一个递归函数获取当前行和行生成器,并同时返回字典和“下一行”。
from collections import namedtuple
LineData = namedtuple('LineData', 'indent text')
def yield_linedata(text):
yield LineData(indent=-1, text='')
for line in text.split('\n'):
if line.strip() != '':
yield LineData(indent=len(line)-len(line.lstrip()), text=line.strip())
yield LineData(indent=-1, text='')
def create_dict(cur_ld, line_yielder):
next_ld = next(line_yielder)
if cur_ld.indent >= next_ld.indent:
return -1, next_ld
d = {}
while cur_ld.indent < next_ld.indent:
d[next_ld.text], next_ld = create_dict(next_ld, line_yielder)
return d, next_ld
line_yielder = yield_linedata(var)
cur_ld = next(line_yielder)
result, next_line = create_dict(cur_ld, line_yielder)
print resulthttps://stackoverflow.com/questions/33204877
复制相似问题