Рекурсивная функция, вероятно, будет намного проще работать и более элегантна.
Это частично псевдокод, но он может помочь вам задуматься.
Я не проверял его, но я уверен, что он должен работать, если у вас нет списков, которые являются непосредственно элементами других списков. Таким образом, у вас могут быть диктанты, списки и списки диктовок, но не списки списков.
def unflatten(data):
resultDict = {}
for e in data:
insertElement(e.split("."), data[e], resultDict)
return resultDict
def insertElement(path, value, subDict):
if (path[0] is of the form "foo[n]"):
key, index = parseListNotation(path[0])
if (key not in subDict):
subDict[key] = []
if (index >= subDict[key].len()):
subDict[key].expandUntilThisSize(index)
if (subDict[key][index] == None):
subDict[key][index] = {}
subDict[key][index] = insertElement(path.pop(0), value, subDict[key][index])
else:
key = path[0]
if (path.length == 1):
subDict[key] = value
else:
if (key not in subDict):
subDict[key] = {}
subDict[key] = insertElement(path.pop(0), value, subDict[key])
return subDict;
Идея состоит в том, чтобы построить словарь изнутри. E.g.:
Для первого элемента сначала создайте словарь `
Затем присвойте это элементу нового словаря
{c : [None]}, c[0] = {key1: 1}
Затем присвойте этот словарь следующему элементу b
в новом dict, как
- {b: {c : [{key1: 1}]}
Присвойте этот результат a
в новом дикте.
- {a: {b: {c : [{key1: 1}]}}
И, наконец, верните этот полный словарь, чтобы использовать его для добавления следующего значения.
Если вы не знакомы с рекурсивными функциями, я бы порекомендовал попрактиковаться с некоторыми более простыми, а затем написать ту, которая делает то, что вы хотите, но для ввода это только словари.
Общий путь рекурсивной функции только для словаря:
Учитывая путь, это список атрибутов вложенных словарей ([a, b, c, key1]
в вашем примере, если c не было списка):
Start (path, value):
If there's only item in your path, build a dictionary setting
that key to your value, and you're done.
If there's more than one, build a dictionary using the first
element as a key, and set the value as the output of Start(path.remove(0), value)