【问题标题】:convert directory-tree like strings into nested list data structure python将类似目录树的字符串转换为嵌套列表数据结构python
【发布时间】:2018-05-13 17:09:20
【问题描述】:

我有一个“类目录树”字符串的列表。我想将其转换为嵌套列表(或另一种数据结构),以强调依赖关系。 例如,输入:

hierarchy_list

dir1
dir1/dir1.1                                            
dir1/dir1.2
dir1/dir1.3/dir1.3.1/dir1.3.1.1
dir1/dir1.1/dir1.1.1
dir1/dir1.1/dir1.1.2

需要转换为:

dir1 ->
    dir1.1 -> dir1.1.1 , dir1.1.2
    dir1.2
    dir1.3 -> dir1.3.1 , dir1.3.2

'->' 表示'包含'(以数组属性或等效形式)。

dir1 包含 dir1.1 、 1.2 、 1.3 的列表

dir1.1 包含 dir1.1.1 、 dir1.1.2 的列表

等等……

有人知道如何在 Python 中实现(算法和实现)吗?

【问题讨论】:

    标签: python algorithm sorting data-structures


    【解决方案1】:

    通过一点递归和dict 可以这样完成:

    代码:

    def build_dir_dict(dir_name_strings):
    
        def _build_dir_dict(path_pieces, dir_dict):
            print(path_pieces)
            if path_pieces:
                if not path_pieces[0]:
                    _build_dir_dict(path_pieces[1:], dir_dict)
                else:
                    if path_pieces[0] not in dir_dict:
                        dir_dict[path_pieces[0]] = {}
                    _build_dir_dict(path_pieces[1:], dir_dict[path_pieces[0]])
    
        result = {}
        for dir_name_string in dir_name_strings:
            if dir_name_string:
                _build_dir_dict(dir_name_string.split('/'), result)
        return result
    

    测试代码:

    data = [x.strip() for x in """
        dir1 
        dir1/dir1.1
        dir1/dir1.2 
        dir1/dir1.3/dir1.3.1/dir1.3.1.1 
        dir1/dir1.1/dir1.1.1 
        dir1/dir1.1/dir1.1.2
    """.split('\n')[1:-1]]
    
    print(build_dir_dict(data))
    

    结果:

    {'dir1': {'dir1.1': {'dir1.1.1': {}, 'dir1.1.2': {}}, 
              'dir1.2': {}, 
              'dir1.3': {'dir1.3.1': {'dir1.3.1.1': {}}}
        }
    }
    

    【讨论】:

    • 谢谢!这看起来非常甜蜜的解决方案。我有一个关于递归的想法,但它留在了我的脑海中......
    【解决方案2】:

    对于每条路径,您只需在“/”上 split() 它,然后循环遍历它们,添加到现有密钥或根据需要创建密钥,然后将其分配给当前父项以供下一步考虑。例如:

    arr= ['dir1','dir1/dir1.1','dir1/dir1.2','dir1/dir1.3/dir1.3.1/dir1.3.1.1', 'dir1/dir1.1/dir1.1.1','dir1/dir1.1/dir1.1.2']
    
    d = dict()
    for path in arr:
        parent = d
        for dir in path.split('/'):    
            if dir not in parent:
                parent[dir] = dict()
            parent = parent[dir]
    

    d 的结果将如下所示:

    {'dir1': {'dir1.1': {'dir1.1.1': {}, 'dir1.1.2': {}},
              'dir1.2': {},
              'dir1.3': {'dir1.3.1': {'dir1.3.1.1': {}}}
              }
    }
    

    【讨论】:

    • 谢谢,伙计!问题是我不知道层次结构的深度...寻找上面的递归解决方案
    猜你喜欢
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2021-07-07
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多