Упростить / улучшить Python алгоритм фильтрации - PullRequest
0 голосов
/ 30 апреля 2020

Я ищу способ определения файлов dist. xml, которые находятся в самом верхнем каталоге.

Например, у меня есть этот список списка каталогов,

/opt/pictures/dist.xml
/opt/docs_old/dist.xml
/opt/public/dist.xml
/opt/documents/server/dist.xml
/opt/documents/dist.xml
/opt/documents/web/dist.xml
/opt/documents/class/dist.xml
/opt/documents/lessons/1/dist.xml
/opt/documents/lessons/2/dist.xml
/opt/documents/lessons/3/dist.xml
/opt/documents/lessons/4/dist.xml
/opt/documents/lessons/5/dist.xml
/opt/music/service/day/dist.xml
/opt/music/service/week/dist.xml
/opt/music/service/month/dist.xml
/opt/music/service/month/1/dist.xml
/opt/music/service/month/2/dist.xml

и я хочу получить этот вывод вместо

/opt/pictures/dist.xml
/opt/docs_old/dist.xml
/opt/public/dist.xml
/opt/documents/dist.xml
/opt/music/service/day/dist.xml
/opt/music/service/week/dist.xml
/opt/music/service/month/dist.xml

У меня есть следующий код, который, кажется, выполняет эту работу, задаваясь вопросом, есть ли способ ускорить или очистить код,

from pathlib import Path

paths = ['/opt/pictures/dist.xml', '/opt/docs_old/dist.xml', '/opt/public/dist.xml', '/opt/documents/server/dist.xml', '/opt/documents/dist.xml', '/opt/documents/web/dist.xml', '/opt/documents/class/dist.xml', '/opt/documents/lessons/1/dist.xml', '/opt/documents/lessons/2/dist.xml', '/opt/documents/lessons/3/dist.xml', '/opt/documents/lessons/4/dist.xml', '/opt/documents/lessons/5/dist.xml', '/opt/music/service/day/dist.xml', '/opt/music/service/week/dist.xml', '/opt/music/service/month/dist.xml', '/opt/music/service/month/1/dist.xml', '/opt/music/service/month/2/dist.xml']

paths = list(set(paths))
paths_folder = [str(Path(p).parent) for p in paths]

to_remove = []
for idx, val in enumerate(paths_folder):
  for b in Path(val).parents:
    if str(b) in paths_folder:
      to_remove.append(idx)

paths_folder = [i for j, i in enumerate(paths_folder) if j not in to_remove]

paths_folder = [p + '/dist.xml' for p in paths_folder]

print(paths_folder)

1 Ответ

0 голосов
/ 01 мая 2020

Вот подход, который может быть чище, поскольку он избегает отслеживания индекса, и т. Д. c.:

Сначала отсортируйте все path_folders, чтобы сначала были самые верхние папки. Затем проверьте наличие каждой родительской папки в списке «верхних папок», как вы это делали, но с использованием встроенного all() , который имеет значение true только после того, как условие истинно для всех элементов. Затем немедленно добавьте его в окончательный список папок, поскольку любой элемент , следующий за , является либо другой папкой, либо дочерней по отношению к текущей; из-за того, что было сделано раньше.

from pathlib import Path

paths = ['/opt/pictures/dist.xml', '/opt/docs_old/dist.xml', ...]  # as above
path_folders = sorted(set(Path(p).parent for p in paths),
                      key=lambda x: (len(x.parts), x))    # is now sorted tops-first

top_folders = []
for folder in path_folders:
    if all(parent not in top_folders for parent in folder.parents):
        top_folders.append(folder)

top_dists = [f / 'dist.xml' for f in top_folders]  # can use '/' with Path objs!
print(top_dists)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...