python - Python - 如何使用树项转换字典列表?
问题描述
我有一个带有 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': []
})
解决方案
您可以使用递归:
[{'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': []}]
推荐阅读
- mysql - LIKE 查询没有禁用 MySQL 中的复合索引的原因是什么
- numpy - 使用 einsum 从 5d 矩阵中提取对角线(横向向下)
- amazon-web-services - 双 NAT iptables
- java - 如何将节点对象注入spring mvc中的服务类?
- asp.net-core - 运行 aspnetcore 应用程序,使用它的 API 并从 Azure DevOps 关闭
- regex - 驼峰模式匹配
- javascript - 将数组映射到对象
- c++ - 我的 c++ 编译器给出了正确的输出,但 c++ 的 codeforces 编译器给出了错误的输出
- python - Google Cloud Functions - Cloud SQL 中止连接
- android - 如果 react-native DeviceMotion 不可用怎么办?