【问题标题】:Transformation of file list based on higher priority [closed]基于更高优先级的文件列表转换[关闭]
【发布时间】:2020-11-25 07:03:42
【问题描述】:

我有一个目录中具有不同名称的文件列表,我需要根据优先级一次转换所有文件。以“AB”开头的文件比以“CD”开头的文件具有更高的优先级。在每个集合中,按名称升序排列文件并选择第一个。

输入:
AB_2908_02P.xml
CD_2908_02P.xml

代码:

def Send_Request(self):
    Directory = "c://users/request/"
    #Type = 'AB','CD'
    xml_files = Type + '_' + '2908_02P' + '.xml'
    if os.path.exists(Directory+xml_files):
        for file in os.listdir(Directory):
            #AB_2908_02P.xml
            #CD_2908_02P.xml
            if file.startswith('AB'):
                print ("first priority")
            elif file.startswith('CD'):
                print("second priority")
                

谁能告诉我使用优先队列的最佳方式是什么?

【问题讨论】:

  • 请提供一个更直观的输入输出示例,我不明白这个问题的具体说明。
  • 为什么你认为优先队列是一个好主意?如果您认为这是个好主意,请阅读heapq 上的文档
  • 欢迎您!您能否一次获得完整列表并设置优先级,而不会有在此过程中出现新文件的风险?如果是这样,只需创建两个空列表,循环文件名并将它们附加到相应的列表中,对列表进行排序并连接它们
  • ...既然 AB 的优先级比 CD 高,为什么不按照文件名的字典顺序对所有文件的列表进行排序?例如for file in sorted(os.listdir(Directory))。这将首先自动迭代 AB 文件...
  • @mrxra 这只是我提到的一个例子

标签: python priority-queue


【解决方案1】:

您可以利用 python 的原生功能对元组进行排序。为您的前缀创建一个查找表prio,然后使用排序键对文件列表进行排序:该函数为每个文件生成一个元组 (prio, filename) 作为排序标准:

import math

files = [
    "AB_2908_02P.xml",
    "CD_2908_02P.xml",
    "AB_2909_02P.xml",
    "CD_2910_02P.xml",
    "XY_2908_03P.xml",
    "CD_3008_02P.xml",
    "AC_xxxx_yyy_zzzzz.xml"
]

prio = {
    'AB': 5,
    'CD': 0,
    'XY': 3
}

for filename in sorted(files, key=lambda f: (prio.get(f.partition('_')[0], math.inf), f)):
    print(filename)

打印:

CD_2908_02P.xml
CD_2910_02P.xml
CD_3008_02P.xml
XY_2908_03P.xml
AB_2908_02P.xml
AB_2909_02P.xml
AC_xxxx_yyy_zzzzz.xml

注意:代码使用 math.inf 作为默认优先级,以防没有为某个前缀定义优先级(如上例中的 AC 的情况) .

【讨论】:

  • 感谢它的工作。但是我在这里仍然有一个疑问,在 for 循环中,它根据优先级进行排序并列出目录中的所有文件。假设一旦循环开始,如果任何其他优先级文件出现(例如:AB)在如何执行该文件之间文件?
  • ...假设一旦循环开始,如果中间有任何其他优先级文件(例如:AB)?介于两者之间究竟如何?
  • 当for循环开始时,一个目录中的所有文件都会根据prio条件列出和排序,一个接一个地执行。但是在循环开始后,如果我将更多文件添加到具有高优先级文件的目录中,那么如何将最新更新的文件也包含到同一个循环中?
  • ...您可能必须至少有 2 个线程,一个观察文件系统的更改,一个处理文件....如果出现新文件,前者会中断后者.这不是正确的(您需要跟踪文件,确保您的数据结构是线程安全的,处理您处理意外死亡的情况等)。此外,您仍然会在 discrete 时刻检查文件系统(文件在其间消失/出现)。我不明白您的确切要求,请更具体
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2021-01-09
  • 2013-02-13
  • 1970-01-01
相关资源
最近更新 更多