Попытка преобразовать текст во вложенный дикт в Python

Я пытаюсь получить вложенный дикт из списка фраз.

Например, мои фразы:

показать версию
показать модуль
показать модуль 0 дет
показать текущую конфигурацию

Я ожидаю такую ​​​​структуру:

"show":{
        "version":None,
        "module":{
            "0": {
                "det"
               }
        },
        "running-config":None
    }

Я пытаюсь: разделить фразы, из каждого массива я конвертирую его в Dict.

for line in commandsOrdered:
    value = line[-1]
    line.pop(-1)
    for key in list(reversed(line[:])):
        value = {key: value}
        sL.append(value)

И как только у меня есть список диктов, я объединяю словари.

super_dict = {}
for d in sL:
    for k, v in d.items(): 
        super_dict.setdefault(k, []).append(v)

Но я получаю это:

{
    "show": [
        "module",
        {
            "module": {
                "0": "det"
            }
        },
        "running-config",
        "version"
    ],
    "0": [
        "det"
    ],
    "module": [
        {
            "0": "det"
        }
    ]
}

Максимальная глубина, которую я имею, составляет 9 слов во фразе.

Есть идеи, как это решить?

Спасибо

{"det"} должно быть {"det": None}?

Mark 23.12.2020 02:39

Нет, с {"det"} достаточно, но это не имеет значения, оба варианта в порядке.

csr23 23.12.2020 02:40

"with {"det"} достаточно" - это не имеет смысла, у вас не может быть ключа в словаре без значения. Вы хотите, чтобы самые внутренние словари были наборами или списками? Или вы ожидаете какую-то ценность для ключей?

Grismar 23.12.2020 02:42
{"det"} это набор. Что делает show module 0 det набором, а не другими листовыми узлами?
blhsing 23.12.2020 02:42

Также я предполагаю, что sL является list (мы не видим, где он построен), но вы не ожидаете, что list будет в ожидаемом результате.

Selcuk 23.12.2020 02:43

ну, это было для простоты, но да, чтобы сделать структуру, я могу добавить {"det":None}

csr23 23.12.2020 02:45

Я буквально только что создал одну строку перед for. SL = []

csr23 23.12.2020 02:46

@ csr23 Разрешение "det": None делает это намного проще :)

Sash Sinha 23.12.2020 02:47
Почему в 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
8
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Что-то вроде этого довольно просто:

commandsOrdered = [
    'show version',
    'show module',
    'show module 0 det',
    'show running-config'
]

result = {}
for command in commandsOrdered:
    parts = command.split()
    d = result
    for key in parts[:-1]:
        if key not in d or not d[key]:
            d[key] = {}
        d = d[key]
    d[parts[-1]] = None

print(result)

Выход:

{'show': {'version': None, 'module': {'0': {'det': None}}, 'running-config': None}}

Не использовать defaultdict для выполнения требования None. Вы могли бы легко написать это и рекурсивно, учитывая ограниченную глубину. Это сделало бы более простой код, но не более быстрое решение как таковое.

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