Я работаю над проектом связи с радио, которое передает форматированное строковое сообщение, похожее на:
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,
}
}
где ошибка не будет выдана, если одна из переменных отсутствует в передаче (поскольку такое иногда случается). Как мне преобразовать эту строку в словарь?
@trincot нет, я действительно хочу создать словарь - я просто сказал «похоже», потому что перед публикацией я переименовал свои переменные.
ХОРОШО. Другое дело: пробелов перед variables
столько же, сколько и раньше 0.01 First variable
. Либо первая строка кода неверна, либо вторая распечатка неверна.
Спасибо, что указали на это, я удалил лишний пробел в первой строке кода.
Предполагая, что отступы увеличиваются на один пробел за раз, вы можете использовать это решение на основе стека:
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
, но поскольку это действительно часть входных данных, я оставил его таким.
«Мне нужен результат, похожий на»: значит, вы не хотите создавать словарь, а распечатываете для него код?