[英]Convert a list of files to a tree-like dictionary
假設我有一個如下所示的列表:
list_all_files = [['folder1', 'subfolder1', 'file1'],
['folder1', 'subfolder1', 'file2'],
['folder1', 'subfolder1', 'file3'],
['folder1', 'subfolder1', 'file4'],
['folder1', 'subfolder2', 'file1'],
['folder1', 'subfolder2', 'file2'],
['folder2', 'subfolder1', 'file1'],
['folder2', 'subfolder1', 'file2'],
['folder3', 'file1'],
['folder3', 'file2'],
['folder4', 'subfolder1', 'file1'],
['folder4', 'subfolder1', 'file2'],
['folder2', 'subfolder2', 'file1'],
['folder2', 'subfolder2', 'file2'],
['folder2', 'subfolder2', 'file3'],
['folder2', 'subfolder2', 'file4']]
“list_all_files”只是一個例子 - 列表也可以有零個或 n 個文件夾和/或子文件夾和/或文件。 如何將其轉換為如下所示的字典?
dict_all_files =
{ 'folder1': {'subfolder1': {'file1', 'file2', 'file3', 'file4'},
'subfolder2': {'file1', 'file2'}},
'folder2': {'subfolder1': {'file1', 'file2'},
'subfolder2': {'file1', 'file2', 'file3', 'file4'}},
'folder3': {'file1', 'file2'},
'folder4': {'subfolder1': {'file1', 'file2'}} }
我嘗試遍歷列表並使用 dict.update(),如下所示:
dict_all_files = {}
for member in list_all_files:
if member[0] == 'folder1':
dict_all_files.update({'folder1': ''})
for element in member:
if member[1] == 'subfolder1':
dict_all_files.update({folder1': member[1]})
但是我會覆蓋文件夾,而且我必須手動為每個文件夾和子文件夾編寫 if 語句,這不是很實用。 所以在我的代碼上工作毫無意義,因為它已經有缺陷了。 也許我從一開始就想錯了? 如果有人可以提供答案或至少是提示,那就太好了。 我沒有發現任何問題可以回答這個或類似的問題。
您可以使用dict.setdefault
來清理您的代碼。
import pprint
list_all_files = [['folder1', 'subfolder1', 'file1'],
['folder1', 'subfolder1', 'file2'],
['folder1', 'subfolder1', 'file3'],
['folder1', 'subfolder1', 'file4'],
['folder1', 'subfolder2', 'file1'],
['folder1', 'subfolder2', 'file2'],
['folder2', 'subfolder1', 'file1'],
['folder2', 'subfolder1', 'file2'],
['folder3', 'file1'],
['folder3', 'file2'],
['folder4', 'subfolder1', 'file1'],
['folder4', 'subfolder1', 'file2'],
['folder2', 'subfolder2', 'file1'],
['folder2', 'subfolder2', 'file2'],
['folder2', 'subfolder2', 'file3'],
['folder2', 'subfolder2', 'file4']]
result = {}
for path in list_all_files:
head = result
for name in path[:-2]:
head = head.setdefault(name,{})
head.setdefault(path[-2],set()).add(path[-1])
pprint.pprint(result)
輸出
{'folder1': {'subfolder1': set(['file1', 'file2', 'file3', 'file4']),
'subfolder2': set(['file1', 'file2'])},
'folder2': {'subfolder1': set(['file1', 'file2']),
'subfolder2': set(['file1', 'file2', 'file3', 'file4'])},
'folder3': set(['file1', 'file2']),
'folder4': {'subfolder1': set(['file1', 'file2'])}}
list_all_files = [['folder1', 'subfolder1', 'file1'],
['folder1', 'subfolder1', 'file2'],
['folder1', 'subfolder1', 'file3'],
['folder1', 'subfolder1', 'file4'],
['folder1', 'subfolder2', 'file1'],
['folder1', 'subfolder2', 'file2'],
['folder2', 'subfolder1', 'file1'],
['folder2', 'subfolder1', 'file2'],
['folder3', 'file1'],
['folder3', 'file2'],
['folder4', 'subfolder1', 'file1'],
['folder4', 'subfolder1', 'file2'],
['folder2', 'subfolder2', 'file1'],
['folder2', 'subfolder2', 'file2'],
['folder2', 'subfolder2', 'file3'],
['folder2', 'subfolder2', 'file4']]
tree = dict()
def create_tree(l):
for f in l:
cur = tree
# all folders and subfolder till will have dict as key except last subfolder/folder.
for s in f[:-2]:
if s not in cur:
cur[s] = dict()
cur = cur[s]
# last folder/subfolder will be list.
if f[-2] not in cur:
cur[f[-2]] = set()
cur = cur[f[-2]]
# add file to list
cur.add(f[-1])
create_tree(list_all_files)
tree
{'folder1': {'subfolder1': {'file1', 'file2', 'file3', 'file4'},
'subfolder2': {'file1', 'file2'}},
'folder2': {'subfolder1': {'file1', 'file2'},
'subfolder2': {'file1', 'file2', 'file3', 'file4'}},
'folder3': {'file1', 'file2'},
'folder4': {'subfolder1': {'file1', 'file2'}}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.