我有一个带有ID链接的字典列表:
[
{ 'id': 1, 'parent_id': None, 'title': '1', },
{ 'id': 3, 'parent_id': 1, 'title': '1.1', },
{ 'id': 5, 'parent_id': 4, 'title': '1.2.1', },
{ 'id': 2, 'parent_id': None, 'title': '2', },
{ 'id': 4, 'parent_id': 1, 'title': '1.2', }
]
我需要创建一个看起来像这样的树对象:
[
{ 'id': 1,'title': '1', 'children': [
{'id': 3, 'title': '1.1', 'children': []},
{'id': 4, 'title': '1.2', 'children': [
{'id': 5, 'title': '1.2.1', 'children': []},
]},
]},
{ 'id': 2, 'title': '2', 'children': []},
]
如何在Python中做到这一点?感谢您的帮助!
UPD 我尝试过此代码,但我不知道如何编写在2级或更高级别上有效的代码。
for element in elements_list:
if not element.get('parent_id'):
menu.append({
'id': element.get('id'),
'title': element.get('title'),
'children': []
})
else:
for item in menu:
if item.get('id') == element.get('parent_id'):
item.get('children').append({
'title': element.get('title'),
'children': []
})
答案 0 :(得分:0)
您可以使用递归:
[{'id': 1, 'parent_id': None, 'title': '1'}, {'id': 3, 'parent_id': 1, 'title': '1.1'}, {'id': 5, 'parent_id': 4, 'title': '1.2.1'}, {'id': 2, 'parent_id': None, 'title': '2'}, {'id': 4, 'parent_id': 1, 'title': '1.2'}]
def _filter(_d):
return {a:b for a, b in _d.items() if a != 'parent_id'}
def group_vals(_d, _start = None):
return [_filter({**i, 'children':group_vals(_d, i['id'])})
for i in _d if i['parent_id'] == _start]
print(group_vals(d))
输出:
[{'id': 1, 'title': '1', 'children': [
{'id': 3, 'title': '1.1', 'children': []},
{'id': 4, 'title': '1.2', 'children': [{'id': 5, 'title': '1.2.1', 'children': []}]}]},
{'id': 2, 'title': '2', 'children': []}]