Я пытаюсь получить вложенный дикт из списка фраз.
Например, мои фразы:
показать версию
показать модуль
показать модуль 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"} достаточно, но это не имеет значения, оба варианта в порядке.
"with {"det"} достаточно" - это не имеет смысла, у вас не может быть ключа в словаре без значения. Вы хотите, чтобы самые внутренние словари были наборами или списками? Или вы ожидаете какую-то ценность для ключей?
{"det"}
это набор. Что делает show module 0 det
набором, а не другими листовыми узлами?
Также я предполагаю, что sL
является list
(мы не видим, где он построен), но вы не ожидаете, что list
будет в ожидаемом результате.
ну, это было для простоты, но да, чтобы сделать структуру, я могу добавить {"det":None}
Я буквально только что создал одну строку перед for. SL = []
@ csr23 Разрешение "det": None
делает это намного проще :)
Что-то вроде этого довольно просто:
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
. Вы могли бы легко написать это и рекурсивно, учитывая ограниченную глубину. Это сделало бы более простой код, но не более быстрое решение как таковое.
{"det"}
должно быть{"det": None}
?