首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从缩进文本输入创建嵌套词典

从缩进文本输入创建嵌套词典
EN

Stack Overflow用户
提问于 2015-10-19 08:31:57
回答 2查看 383关注 0票数 1

我有一个文本输入,格式是-

代码语言:javascript
复制
var="""
interface A
  member-1
  member-2
    submember-1
    submember-2
interface B
  member-1
interface C

"""

我将不得不将其转换为如下所示的python嵌套字典形式。另外,任何没有子成员的元素都将被赋值为-1。

代码语言:javascript
复制
result=
{
'interface A':{'member-1': -1 ,'member-2':{'submember-1': -1,'submember-2': -1}}
'interface B' :{'member-1': -1},
'interface C': -1
}

我试着用递归的方式来做,但是我的逻辑似乎不正确。要做到这一点,最好的方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2015-10-19 09:11:53

这有点难看,但是如果你没有太多的缩进级别,这段代码会很有用

代码语言:javascript
复制
_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})
票数 1
EN

Stack Overflow用户

发布于 2015-10-19 13:10:45

对于这样的事情,递归是一个很好的策略,尽管有一点复杂,因为a)您必须跟踪当前正在处理的输入字符串中的哪一行,以及b)您必须向前看并查看未来行的缩进级别,以确定特定的递归调用何时应该返回。

一种解决方案是使用一个生成器来获取连续的行,并使用一个递归函数获取当前行和行生成器,并同时返回字典和“下一行”。

代码语言:javascript
复制
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 result
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33204877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档