python - 递归列表到字典
问题描述
我有一个这样的清单
List = [{"name":"folder1", "id":"folderID1", "parents": ["rootID"]},
{"name":"folder2", "id":"folderID2", "parents": ["rootID"]},
{"name":"sub1", "id":"subID1", "parents": ["folderID1"]},
{"name":"sub1", "id":"subID11", "parents": ["folderID2"]},
{"name":"sub2", "id":"subID2", "parents": ["folderID1"]},
{"name":"sub3", "id":"subID3", "parents": ["subID1"]},
{"name":"sub4", "id":"subID4", "parents": ["subID3"]}]
我想把它变成这样:
{'root': {'folder1': {'sub1': {'sub3': {'sub4': 'subID4'}}, 'sub2': 'sub2ID'},
'folder2': {'sub1': 'subID11'}}}
我试过的代码:
def recursion(parent, List, dic):
for l in List:
if l["id"] == parent:
dic = recursion( l["parents"][0], l, {l["name"]:dic})
return dic
print(recursion("rootID", List, "root"))
输出:
root #it just prints root
编辑:
{'root': {'folder1': {'sub1': {'sub3': {'sub4': 'subID4'}}, 'sub2': 'sub2ID'},
'folder2': {'sub1': 'subID11'}}}
这个字典其实就是目录树形是这样的
root
|
├── folder1
| |
│ ├── sub1
| | |
│ │ └── sub3
| | |
│ │ └── sub4
| |
│ └── sub2
|
└── folder2
|
└── sub1
解决方案
您可以使用递归:
data = [{'name': 'folder1', 'id': 'folderID1', 'parents': ['rootID']}, {'name': 'folder2', 'id': 'folderID2', 'parents': ['rootID']}, {'name': 'sub1', 'id': 'subID1', 'parents': ['folderID1']}, {'name': 'sub1', 'id': 'subID11', 'parents': ['folderID2']}, {'name': 'sub2', 'id': 'subID2', 'parents': ['folderID1']}, {'name': 'sub3', 'id': 'subID3', 'parents': ['subID1']}, {'name': 'sub4', 'id': 'subID4', 'parents': ['subID3']}]
def group(root):
return {i['name']:i['id'] if not (k:=group(root=i['id'])) else k
for i in data if root in i['parents']}
print({'root':group('rootID')})
输出:
{'root': {'folder1': {'sub1': {'sub3': {'sub4': 'subID4'}}, 'sub2': 'subID2'}, 'folder2': {'sub1': 'subID11'}}}
推荐阅读
- python - 如何使用列表推导/双 for 循环访问元素?问题解决IndexError。
- c# - 将用户控件添加到 GroupBox 会更改用户控件在 WinForms 中的布局
- php - 在我的 Laravel 应用程序中放置以及如何调用辅助函数?
- python - pySpark - 行意味着不包括零
- sql - 使用嵌套案例表达式
- sql - 从 Teradata 中的 SQL 获取服务器的 IP 地址
- hl7-fhir - FHIR IG Publisher 模板
- vue.js - 如何在 Vue Chart.js 中使用 Api 数据
- javascript - 将数组(从文本文件读取和处理)元素显示到 JavaScript 中的新行
- firebase - 可以限制firebase“部署访问”吗?