Stack Overflow на русском Asked by WilteRatenau on November 7, 2021
Не получается преобразовать словарь в словарь с вложением.
Из БД получаю:
[
{
'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'
}
]
}
Можно вручную пройтись по списку словарей и составить новый.
Пример:
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, ...
Answered by gil9red on November 7, 2021
воспользуйтесь 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'}]}]
Answered by MaxU on November 7, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP