【问题标题】:Python: Represent directory structure tree as list of listsPython:将目录结构树表示为列表列表
【发布时间】:2019-04-23 02:47:09
【问题描述】:

我有一个从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 ;)

【问题讨论】:

  • 'H' ['K', 'L'], 'F' ['M'] 不是有效的语法。你是说['H', ['K', 'L']]['F', ['M']]吗?
  • hm 我不确定...我的意思是表示顶部显示的结构

标签: python list directory treeview


【解决方案1】:

你可以从扁平化的值构造一个字典,然后使用递归:

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('.'))

【讨论】:

  • ty 用于输入。可悲的是,我正在使用 python 2.7,所以我不能使用加星标的表达式:(
  • @zwusel 请查看我最近编辑的 Python2 兼容解决方案。
【解决方案2】:

这不会返回您正在寻找的数据类型,而是一个嵌套字典(因为这对我来说作为树结构感觉更自然):

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": {}
        }
    }
}

【讨论】:

  • Ty,也许我会将我选择的数据类型更改为 dict...似乎更有意义 ;)
猜你喜欢
  • 2012-12-20
  • 2021-02-17
  • 2014-02-02
  • 1970-01-01
  • 2010-09-12
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
相关资源
最近更新 更多