簡體   English   中英

Python:將目錄結構樹表示為列表列表

[英]Python: Represent directory structure tree as list of lists

我有一個從os.walk提取的目錄列表。 我刪除了文件,因為我不需要它們。

.
|____A
     |____G
     |____H
          |____K
          |____L
|____B
     |____I
     |____J
|____C
|____D
|____E
|____F
     |____M

所以看起來像這樣:

['.', ['A', 'B', 'C', 'D', 'E', 'F']], ['A', ['G', 'H']], ['A\\G', []], ['A\\H', ['K', 'L']], ['A\\G\\K', []], ['A\\G\\L', []], ['B', ['I', 'J']], ['B\\I', []], ['B\\J', []], ['C', []], ['D', []], ['E', []], ['F', ['M']], ['F\\M', []]

我實際上需要的是列表中樹結構的真實表示,如下所示:

['.', ['A' ['G', 'H' ['K', 'L']], ['B' ['I', 'J']], 'C', 'D', 'E', 'F' ['M']] 

ty;)

您可以從展平的值構造一個字典,然后使用遞歸:

import re
d = ['.', ['A', 'B', 'C', 'D', 'E', 'F']], ['A', ['G', 'H']], ['A\\G', []], ['A\\H', ['K', 'L']], ['A\\G\\K', []], ['A\\G\\L', []], ['B', ['I', 'J']], ['B\\I', []], ['B\\J', []], ['C', []], ['D', []], ['E', []], ['F', ['M']], ['F\\M', []]
new_d = {re.findall('.$', a)[0]:b for a, b in d}
def _tree(_start):
  if not new_d[_start]:
    return _start
  _c = [_tree(i) for i in new_d[_start]]
  return [_start, *(_c if any(not isinstance(i, str) for i in _c) else [_c])]

print(_tree('.'))

輸出:

['.', ['A', 'G', ['H', ['K', 'L']]], ['B', ['I', 'J']], 'C', 'D', 'E', ['F', ['M']]]

編輯:Python2版本:

import re
d = ['.', ['A', 'B', 'C', 'D', 'E', 'F']], ['A', ['G', 'H']], ['A\\G', []], ['A\\H', ['K', 'L']], ['A\\G\\K', []], ['A\\G\\L', []], ['B', ['I', 'J']], ['B\\I', []], ['B\\J', []], ['C', []], ['D', []], ['E', []], ['F', ['M']], ['F\\M', []]
new_d = {re.findall('.$', a)[0]:b for a, b in d}
def _tree(_start):
  if not new_d[_start]:
    return _start
  _c = [_tree(i) for i in new_d[_start]]
  return [_start]+(_c if any(not isinstance(i, str) for i in _c) else [_c])

print(_tree('.'))

這不會返回您要查找的數據類型,而是返回一個嵌套的字典(因為對我來說,作為樹形結構,這更自然):

from collections import defaultdict

lst = (['.', ['A', 'B', 'C', 'D', 'E', 'F']],
       ['A', ['G', 'H']], ['A\\G', []],
       ['A\\H', ['K', 'L']], ['A\\G\\K', []], ['A\\G\\L', []],
       ['B', ['I', 'J']], ['B\\I', []], ['B\\J', []], ['C', []],
       ['D', []], ['E', []], ['F', ['M']], ['F\\M', []])

def rec_dd():
    """"recursive default dict"""
    return defaultdict(rec_dd)

tree = rec_dd()
for here, dirs in lst:
    if not here.startswith('.'):
        cur_tree = tree['.']
    else:
        cur_tree = tree
    for key in here.split('\\'):
        cur_tree = cur_tree[key]

    for d in dirs:
        cur_tree[d] = rec_dd()

您可以這樣漂亮地打印它:

import json
print(json.dumps(tree, sort_keys=True, indent=4))

結果是:

{
    ".": {
        "A": {
            "G": {
                "K": {},
                "L": {}
            },
            "H": {
                "K": {},
                "L": {}
            }
        },
        "B": {
            "I": {},
            "J": {}
        },
        "C": {},
        "D": {},
        "E": {},
        "F": {
            "M": {}
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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