преобразовать дерево каталогов как строки в структуру данных вложенного списка python - PullRequest
0 голосов
/ 13 мая 2018

У меня есть список строк, подобных дереву каталогов. Я хочу преобразовать его во вложенный список (или другой тип структуры данных), чтобы подчеркнуть зависимости. например, вход:

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 (алгоритм и реализация)?

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Для каждого пути вы можете просто 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': {}}}
          }
}
0 голосов
/ 13 мая 2018

С небольшим количеством рекурсии и 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': {}}}
    }
}
...