У меня есть такой запрос:
{"key1:key2[0]:key3[0]": "1234",
"key1:key2[0]:key4[0]:key5": "4567",
"key1:key2[1]:key3[0]": "789",
"key1:key2[1]:key4[1]:key5": "12345"}
Ключи - это описательный способ представления происхождения каждого окончательного значения в заданном дикте. :
отделяет родительский ключ от его дочернего ключа, []
означает, что значение предыдущих ключей является списком, а индекс находится между фигурными скобками.
Учитывая это, как я могу создать диктовку, такую как
{
"key1":{
"key2":[
{
"key3":["1234"],
"key4":[{"key5":"4567"}]
},
{
"key3":["789"],
"key4":[{"key5":"12345"}]
}
]
}
}
Я пытался сделать что-то вроде этого:
result_dict = {}
def populate(target_path, value):
current_point_in_path = None
t = result_dict
target_path = target_path.split(":")
for i, each_key in enumerate(target_path):
list_index = re.findall(r'\[(.*?)\]', each_key)
if len(list_index) > 1:
raise Exception("not allowed")
elif len(list_index) == 1:
index = int(list_index[0])
key_before = each_key.split(index)[0]
if not isinstance(result_dict[key_before], list):
t = t.setdefault(key_before, [])
if i+1 == len(target_path):
# the issue is that this insert won't return a pointer to the current index element like setdefault would do
# alternate soultions are wc
t.insert(index, value)
else:
t.insert(index, {})
else:
if i + 1 == len(target_path):
t = t.setdefault(each_key, value)
else:
t = t.setdefault(each_key, {})
Я не могу завершить части кода здесь. Возможно, мне понадобится лучший дизайн с моим описательным языком. Любые предложения приветствуются.