我正在尝试根据现有词典制作一本新词典: 主要词典:
{'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'}
]
}
生成的字典为父/子字典/列表中的每个元素(子文件夹)创建树状结构。 我找不到一种方法来递归地将文件的每个“层”减少到子文件夹。
这是一种可能的解决方案,使用
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"},
],
}