如何创建关于“子”值的嵌套字典

问题描述 投票:0回答:1

我正在尝试根据现有词典制作一本新词典: 主要词典:

{'main_folder/': {'id': 'main_folder', 'ad': 'what'}, 'main_folder/subfolder1/': {'id': 'subfolder1', 'ad': 'what'}, 'main_folder/subfolder1/9GEAbdFPVBqv/': {'id': '9GEAbdFPVBqv', 'ad': 'what1'}, 
'main_folder/subfolder1/eaXY8H5Y1cJ_/': {'id': 'eaXY8H5Y1cJ_', 'ad': 'what2'},
'main_folder/subfolder1/eaXY8H5Y1cJ_/9p2UFp7-qcEt/': {'id': '9p2UFp7-qcEt', 'ad': 'what3'},
'main_folder/subfolder1/fijaCypbmbU1/': {'id': 'fijaCypbmbU1', 'ad': 'what4'}, 
'main_folder/subfolder2/': {'id': 'subfolder2', 'ad': 'what7'}} 

生成的字典应该是这样的:

{'id': 'main_folder', 'ad': 'what', 
    'children':[
     {'id': 'subfolder1', 'ad': 'what', 
        'children':[
         {'id': '9GEAbdFPVBqv', 'ad': 'what1'},
         {'id': 'eaXY8H5Y1cJ_', 'ad': 'what2',
             'children': [{'id': '9p2UFp7-qcEt', 'ad': 'what3'}]},
         {'id': 'fijaCypbmbU1', 'ad': 'what4'}
         ]
      },
      {'id': 'subfolder2', 'ad': 'what7'}
      ]
}

生成的字典为父/子字典/列表中的每个元素(子文件夹)创建树状结构。 我找不到一种方法来递归地将文件的每个“层”减少到子文件夹。

python recursion parent-child
1个回答
0
投票

这是一种可能的解决方案,使用

defaultdict
:

dct = {
    "main_folder/": ["folder_main_folder", {"id": "main_folder", "ad": "what"}],
    "main_folder/subfolder1/": [
        "folder_subfolder1",
        {"id": "subfolder1", "ad": "what"},
    ],
    "main_folder/subfolder1/9GEAbdFPVBqv/": [
        "file_9GEAbdFPVBqv",
        {"id": "9GEAbdFPVBqv", "ad": "what1"},
    ],
    "main_folder/subfolder1/eaXY8H5Y1cJ_/": [
        "folder_eaXY8H5Y1cJ_",
        {"id": "eaXY8H5Y1cJ_", "ad": "what2"},
    ],
    "main_folder/subfolder1/eaXY8H5Y1cJ_/9p2UFp7-qcEt/": [
        "file_9p2UFp7-qcEt",
        {"id": "9p2UFp7-qcEt", "ad": "what3"},
    ],
    "main_folder/subfolder1/fijaCypbmbU1/": [
        "file_fijaCypbmbU1",
        {"id": "fijaCypbmbU1", "ad": "what4"},
    ],
    "main_folder/subfolder2/": [
        "folder_subfolder2",
        {"id": "subfolder2", "ad": "what7"},
    ],
}

{
    "main_folder/": {"id": "main_folder", "ad": "what"},
    "main_folder/subfolder1/": {"id": "subfolder1", "ad": "what"},
    "main_folder/subfolder1/9GEAbdFPVBqv/": {"id": "9GEAbdFPVBqv", "ad": "what1"},
    "main_folder/subfolder1/eaXY8H5Y1cJ_/": {"id": "eaXY8H5Y1cJ_", "ad": "what2"},
    "main_folder/subfolder1/eaXY8H5Y1cJ_/9p2UFp7-qcEt/": {
        "id": "9p2UFp7-qcEt",
        "ad": "what3",
    },
    "main_folder/subfolder1/fijaCypbmbU1/": {"id": "fijaCypbmbU1", "ad": "what4"},
    "main_folder/subfolder2/": {"id": "subfolder2", "ad": "what7"},
}

from collections import defaultdict


def tree():
    return defaultdict(tree)


out = tree()

for keys, (name, data) in zip((k.strip("/").split("/") for k in dct), dct.values()):
    head = out
    for k in keys:
        head = head[k]
    head.update(data)


def convert(dct):
    out = {}
    for k, v in dct.items():
        if k in {"id", "ad"}:
            out[k] = v
        else:
            out.setdefault("children", [])
            out["children"].append(convert(v))
    return out


out = convert(out)
print(out["children"][0])

打印:

{
    "id": "main_folder",
    "ad": "what",
    "children": [
        {
            "id": "subfolder1",
            "ad": "what",
            "children": [
                {"id": "9GEAbdFPVBqv", "ad": "what1"},
                {
                    "id": "eaXY8H5Y1cJ_",
                    "ad": "what2",
                    "children": [{"id": "9p2UFp7-qcEt", "ad": "what3"}],
                },
                {"id": "fijaCypbmbU1", "ad": "what4"},
            ],
        },
        {"id": "subfolder2", "ad": "what7"},
    ],
}
© www.soinside.com 2019 - 2024. All rights reserved.