@Matweytt

Как сделать дерево каталогов из массива путей?

Есть массив типа string mas = [
E:/folder/maps
E:/1/2/3
E:/folder/new
E:/folder/maps/2
D:/papka/echepapka
E:/1/path/dir
]
Каким алгоритмом обойти этот массив чтобы получить иерархию всех папок?
Желательно на python
  • Вопрос задан
  • 1084 просмотра
Решения вопроса 1
adugin
@adugin Куратор тега Python
Например, можно сложить в словарь:
from functools import reduce
from pathlib import PurePosixPath

paths = [
    'E:/folder/maps',
    'E:/1/2/3',
    'E:/folder/new',
    'E:/folder/maps/2',
    'D:/papka/echepapka',
    'E:/1/path/dir',
]

tree = {}
for path in map(PurePosixPath, paths):
    reduce(lambda node, part: node.setdefault(part, {}), path.parts, tree)

Результат:
{'E:': {'folder': {'maps': {'2': {}}, 'new': {}},
  '1': {'2': {'3': {}}, 'path': {'dir': {}}}},
 'D:': {'papka': {'echepapka': {}}}}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
sim3x
@sim3x
Комментировать
tsarevfs
@tsarevfs
C++ developer
Да вроде не нужен тут хитрый алгоритм. Берете очередную строчку, разбиваете ее на отдельные токены.
Дальше в цикле по токенам пытаетесь найти частичный путь, и если не получается добавляете его в дерево.
Например вы добавили первые 2 пути:
E
|-1
| |-2
|   |-3
|-folder
  |-maps

Добавляем "E:/folder/new" Это набор токенов ["E:", "folder", "new"]. E: есть в нашем дереве, идем в это поддерево.
folder опять есть. new не находится, добавляем его.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы