Разбор строки в словарь

Я работаю над проектом связи с радио, которое передает форматированное строковое сообщение, похожее на:

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 26.06.2024 20:31

@trincot нет, я действительно хочу создать словарь - я просто сказал «похоже», потому что перед публикацией я переименовал свои переменные.

AmericanJael 26.06.2024 20:33

ХОРОШО. Другое дело: пробелов перед variables столько же, сколько и раньше 0.01 First variable. Либо первая строка кода неверна, либо вторая распечатка неверна.

trincot 26.06.2024 20:34

Спасибо, что указали на это, я удалил лишний пробел в первой строке кода.

AmericanJael 26.06.2024 20:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что отступы увеличиваются на один пробел за раз, вы можете использовать это решение на основе стека:

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, но поскольку это действительно часть входных данных, я оставил его таким.

Другие вопросы по теме