【问题标题】:Simplify/Enhance Python Filtering Algorithm简化/增强 Python 过滤算法
【发布时间】:2020-04-30 19:38:24
【问题描述】:

我正在寻找一种方法来识别最顶层目录中的 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)

【问题讨论】:

  • 想要的输出 不是对实际输出的不同排序。你的头衔是什么意思?
  • 另外,您能否用文字解释从输入中获取输出的基本原理是什么?

标签: python python-3.x algorithm sorting


【解决方案1】:

这是一种可能更简洁的方法,因为它避免了索引跟踪等:

首先对所有path_folders 进行排序,使其首先成为最顶层的文件夹。然后检查“顶级文件夹”列表中是否存在每个父文件夹,就像您所做的那样,但使​​用all() built-in,只有在所有项目的条件都为真后才为真。然后立即将其添加到最终文件夹列表中,因为任何 该项目之后的内容要么是不同的文件夹,要么是当前文件夹的子文件夹;因为之前的排序。

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2011-05-12
    相关资源
    最近更新 更多