首页 > 解决方案 > 递归列表到字典

问题描述

我有一个这样的清单

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

标签: pythonpython-3.xrecursion

解决方案


您可以使用递归:

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'}}}

推荐阅读