我正在开发一个使用无线电传输格式化字符串消息的通信项目,类似于:
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,
}
}
如果传输中缺少其中一个变量(因为有时会发生这种情况),则不会引发错误。如何将此字符串转换为字典?
假设缩进一次增加一个空格,您可以使用这种基于堆栈的解决方案:
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
级别,但由于这确实是输入的一部分,所以我就这样保留了。