将字符串解析到字典

问题描述 投票:0回答:1

我正在开发一个使用无线电传输格式化字符串消息的通信项目,类似于:

message_string = 'Transmission\n variables \n  0.01 First variable\n  0.02 Second variable\n  0.03 Third variable \n More variables\n  0.03 Next variable\n  0.04 Another variable'

打印时,看起来像这样

print(message_string)
Transmission
 variables
  0.01 First variable
  0.02 Second variable
  0.03 Third variable
 More variables
  0.03 Next variable
  0.04 Another variable

这对人类来说看起来不错,但对计算机来说很棘手 - 特别是因为我试图将其转换为 python 字典。在我的实际系统中,这些变量相当多,代码需要系统地将它们全部处理成字典。

我认为它可能包括类似的内容

message_string = message_string.replace('\n','{')

但是决定在不同情况下使用括号的方向,以及在字典中放置冒号的位置,让我感到困惑。我想要一个类似于

的输出
message_dict = {
    'variables': {
       'First variable': 0.01,
       'Second variable': 0.02,
        'Third variable': 0.03},
    'More variables': {
       'Next variable': 0.03,
       'Another variable': 0.04,
    } 
}

如果传输中缺少其中一个变量(因为有时会发生这种情况),则不会引发错误。如何将此字符串转换为字典?

python string search replace format
1个回答
0
投票

假设缩进一次增加一个空格,您可以使用这种基于堆栈的解决方案:

def to_dict(s):
    result = {}
    stack = [result]
    for line in s.splitlines():
        stripped = line.lstrip()
        indent = len(line) - len(stripped) + 1
        if indent >= len(stack):
            stack.append(None)
        if stripped[0].isdigit():
            value, key = stripped.split(" ", 1)
            stack[indent-1][key] = float(value)
        else:
            stack[indent-1][stripped] = stack[indent] = {}
    
    return result

这样称呼它:

message_string = 'Transmission\n variables \n  0.01 First variable\n  0.02 Second variable\n  0.03 Third variable \n More variables\n  0.03 Next variable\n  0.04 Another variable'
d = to_dict(message_string)

在此示例中

d
将是:

{
    'Transmission': {
        'variables ': {
            'First variable': 0.01, 
            'Second variable': 0.02, 
            'Third variable ': 0.03
        }, 
        'More variables': {
            'Next variable': 0.03, 
            'Another variable': 0.04
        }
    }
}

与你写的相比,这有额外的

Transmission
级别,但由于这确实是输入的一部分,所以我就这样保留了。

© www.soinside.com 2019 - 2024. All rights reserved.