簡體   English   中英

將文件列表轉換為樹狀字典

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM