【问题标题】:Sorting list by string pattern [duplicate]按字符串模式排序列表[重复]
【发布时间】:2022-01-12 00:57:06
【问题描述】:

我有一个看起来像这样的文件列表:

listOfFiles = ['XLOG100.LOG', 'XLOG101.LOG', 'XLOG102.LOG', 'XLOG103.LOG', 'XLOG104.LOG', 'XLOG105.LOG', 'XLOG106.LOG', 'XLOG107.LOG', 'XLOG108.LOG', 'XLOG109.LOG', 'XLOG110.LOG',   'XLOG92.LOG', 'XLOG93.LOG', 'XLOG94.LOG', 'XLOG95.LOG', 'XLOG96.LOG', 'XLOG97.LOG', 'XLOG98.LOG', 'XLOG99.LOG']

需要从最大值到最小值进行排序。 我想出了在 XLOG 之后找到最大值并使用此算法创建一个新列表的想法。但是有没有更简单的方法来排序这个列表?也许我错过了什么。 文件的一般模式是:XLOGindex.LOG,其中index n > 1。

最终的结果应该是这样的:

listOfFiles = ['XLOG110.LOG', 'XLOG109.LOG', 'XLOG108.LOG', 'XLOG107.LOG', 'XLOG106.LOG', 'XLOG105.LOG', 'XLOG104.LOG', 'XLOG103.LOG', 'XLOG102.LOG', 'XLOG101.LOG', 'XLOG100.LOG', 'XLOG99.LOG', 'XLOG98.LOG', 'XLOG97.LOG', 'XLOG96.LOG', 'XLOG95.LOG', 'XLOG94.LOG', 'XLOG93.LOG', 'XLOG92.LOG']

感谢您的任何想法;)

【问题讨论】:

  • 你应该发布你当前的解决方案

标签: python python-3.x list sorting


【解决方案1】:

您可以将函数sorted 与“键”函数结合使用。您的案例中的 key 函数提取文件名的数字部分(从第 4 位到负的第 4 位)并将其转换为数字:

sorted(listOfFiles, key=lambda x: int(x[4:-4]), reverse=True)
# ['XLOG110.LOG', 'XLOG109.LOG', 'XLOG108.LOG', 'XLOG107.LOG', 
#  'XLOG106.LOG', 'XLOG105.LOG', 'XLOG104.LOG', 'XLOG103.LOG', 
#  'XLOG102.LOG', 'XLOG101.LOG', 'XLOG100.LOG', 'XLOG99.LOG', 
#  'XLOG98.LOG', 'XLOG97.LOG', 'XLOG96.LOG', 'XLOG95.LOG', 'XLOG94.LOG', 
#  'XLOG93.LOG', 'XLOG92.LOG']

【讨论】:

    【解决方案2】:

    由于您只关心数字,因此您可以使用filter 过滤掉所有不是数字的内容;然后将结果转换为int

    listOfFiles = ['XLOG100.LOG', 'XLOG101.LOG', 'XLOG102.LOG', 'XLOG103.LOG', 'XLOG104.LOG', 'XLOG105.LOG', 'XLOG106.LOG', 'XLOG107.LOG', 'XLOG108.LOG', 'XLOG109.LOG', 'XLOG110.LOG',   'XLOG92.LOG', 'XLOG93.LOG', 'XLOG94.LOG', 'XLOG95.LOG', 'XLOG96.LOG', 'XLOG97.LOG', 'XLOG98.LOG', 'XLOG99.LOG']
    
    listOfFiles.sort(key=lambda s: int(''.join(filter(str.isdigit, s))), reverse=True)
    
    print(listOfFiles)
    # ['XLOG110.LOG', 'XLOG109.LOG', 'XLOG108.LOG', 'XLOG107.LOG', 'XLOG106.LOG', 'XLOG105.LOG', 'XLOG104.LOG', 'XLOG103.LOG', 'XLOG102.LOG', 'XLOG101.LOG', 'XLOG100.LOG', 'XLOG99.LOG', 'XLOG98.LOG', 'XLOG97.LOG', 'XLOG96.LOG', 'XLOG95.LOG', 'XLOG94.LOG', 'XLOG93.LOG', 'XLOG92.LOG']
    

    【讨论】:

      【解决方案3】:

      您可以使用 python 列表排序功能对列表进行适当的排序。将参数 reverse=Truekey=extract_indexextract_index 一起使用,该函数可以提取您在字符串中查找的索引

      l = [
          "XLOG100.LOG",
          "XLOG101.LOG",
          "XLOG102.LOG",
          "XLOG103.LOG",
          "XLOG104.LOG",
          "XLOG105.LOG",
          "XLOG106.LOG",
          "XLOG107.LOG",
          "XLOG108.LOG",
          "XLOG109.LOG",
          "XLOG110.LOG",
          "XLOG92.LOG",
          "XLOG93.LOG",
          "XLOG94.LOG",
          "XLOG95.LOG",
          "XLOG96.LOG",
          "XLOG97.LOG",
          "XLOG98.LOG",
          "XLOG99.LOG",
      ]
      import re
      
      
      def extract_index(s: str) -> int:
          r = re.search(r"XLOG(\d+).LOG", s)
          if r:
              return int(r.group(1))
          raise ValueError(f"Wrong pattern {s}")
      
      l.sort(reverse=True, key=extract_index)
      print(l)
      >>> ['XLOG110.LOG', 'XLOG109.LOG', 'XLOG108.LOG', 'XLOG107.LOG', 'XLOG106.LOG', 'XLOG105.LOG', 'XLOG104.LOG', 'XLOG103.LOG', 'XLOG102.LOG', 'XLOG101.LOG', 'XLOG100.LOG', 'XLOG99.LOG', 'XLOG98.LOG', 'XLOG97.LOG', 'XLOG96.LOG', 'XLOG95.LOG', 'XLOG94.LOG', 'XLOG93.LOG', 'XLOG92.LOG']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-29
        • 1970-01-01
        • 2021-01-25
        • 2018-10-12
        • 2014-02-13
        • 1970-01-01
        • 2014-06-19
        • 1970-01-01
        相关资源
        最近更新 更多