преобразовать словарь в словарь с вложением
Не получается преобразовать словарь в словарь с вложением.
Из БД получаю:
[
{
'id': 1,
'name': 'default',
'sub_id': 20,
'sub_name': 'default default'
},
{
'id': 1,
'name': 'default',
'sub_id': 21,
'sub_name': 'default default'
},
{
'id': 1,
'name': 'default',
'sub_id': 22,
'sub_name': 'default default'
},
{
'id': 2,
'name': 'default',
'sub_id': 30,
'sub_name': 'default default'
},
{
'id': 2,
'name': 'default',
'sub_id': 31,
'sub_name': 'default default'
},
{
'id': 2,
'name': 'default',
'sub_id': 32,
'sub_name': 'default default'
}
]
А необходимо сделать вложение и объеденить по id. Результат должен быть таким:
{
{
'id': 1,
'name': 'default',
'sub_elem': [
{
'sub_id': 20,
'sub_name': 'default default'
},
{
'sub_id': 21,
'sub_name': 'default default'
},
{
'sub_id': 22,
'sub_name': 'default default'
}
]
},
{
'id': 2,
'name': 'default',
'sub_elem': [
{
'sub_id': 30,
'sub_name': 'default default'
},
{
'sub_id': 31,
'sub_name': 'default default'
},
{
'sub_id': 32,
'sub_name': 'default default'
}
]
}
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
воспользуйтесь Pandas:
df = pd.DataFrame(data)
res = (df
.groupby(["id", "name"])
[["sub_id", "sub_name"]]
.apply(lambda x: x.to_dict("r"))
.reset_index(name="sub_elem")
.to_dict("r"))
результат:
In [16]: res
Out[16]:
[{'id': 1,
'name': 'default',
'sub_elem': [{'sub_id': 20, 'sub_name': 'default default'},
{'sub_id': 21, 'sub_name': 'default default'},
{'sub_id': 22, 'sub_name': 'default default'}]},
{'id': 2,
'name': 'default',
'sub_elem': [{'sub_id': 30, 'sub_name': 'default default'},
{'sub_id': 31, 'sub_name': 'default default'},
{'sub_id': 32, 'sub_name': 'default default'}]}]
Автор решения: gil9red
→ Ссылка
Можно вручную пройтись по списку словарей и составить новый.
Пример:
data = ...
new_data = dict()
for x in data:
id_ = x['id']
if id_ not in new_data:
new_data[id_] = {
'id': id_,
'name': x['name'],
'sub_elem': []
}
sub_elem = new_data[id_]['sub_elem']
sub_elem.append({
'sub_id': x['sub_id'],
'sub_name': x['sub_name'],
})
result = list(new_data.values())
print(result)
# [{'id': 1, 'name': 'default', 'sub_elem': [{'sub_id': 20, ...