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