【问题标题】:how to sort a list containing filenames?如何对包含文件名的列表进行排序?
【发布时间】:2021-05-05 07:29:56
【问题描述】:

我有一个大约 1000 多个值的列表。这些值是os.listdir(folder_path) 给出的文件夹中的文件名

代码如下:

import os

folder_path = "some path here"
filelist = os.listdir(folder_path)

print(filelist)

现在,当我查看打印的列表时,我发现该列表没有按名称排序。文件名类似于["text-1-1.txt","txt-1-23.txt","txt-1-32.txt","txt-1-10.txt","txt-2-1.txt","txt-2-32.txt"...]

另外,我知道有些文件名会加一,例如:text-1-1.txt、text-1-2.txt、text-1-3.txt、.... text-2- 1.txt, text-2-2.txt,...

我已经尝试了这两种方法来尝试对列表进行排序:new_list = sorted(filelist) & filelist.sort()

两者都不起作用,并且列表与原始列表相同,我该如何对该列表进行排序?我是否必须手动编写排序算法(如 Bubble 或 Selection)?

【问题讨论】:

    标签: python arrays list sorting listdir


    【解决方案1】:

    你可以这样运行:

    import os
    
    folder_path = "some path here"
    filelist = os.listdir(folder_path)
    filelist.sort()    #Added this line
    
    print(filelist)
    

    【讨论】:

    • OP 已经提到您建议的方法不起作用。
    • @maverick_06 奥普斯。对不起,我想我忽略了。我测试了只添加了一行,这很有效。也许在创建新列表后它仍然显示旧列表?
    【解决方案2】:

    默认情况下,python 已经按字典顺序对字符串进行排序,但大写字母都排在小写字母之前。如果你想对字符串进行排序并忽略大小写,那么你可以这样做

    new_filelist = sorted(filelist, key=str.lower)
    

    【讨论】:

      【解决方案3】:

      您可以为此创建一个自定义函数,从文件名中创建一个 tupleints:

      >>> def sl_no(s):
              return tuple(map(int,s.split('.')[0].rsplit('-', 2)[-2:]))
      
      >>> sl_no("text-1-1.txt")
      (1, 1)
      
      >>> sorted(filelist, key=sl_no)
       
      ['text-1-1.txt',
       'txt-1-10.txt',
       'txt-1-23.txt',
       'txt-1-32.txt',
       'txt-2-1.txt',
       'txt-2-32.txt']
      

      或者,您可以使用re

      >>> import re
      >>> sorted(filelist, lambda x: tuple(re.findall(r'\d+', x)))
      
      ['text-1-1.txt',
       'txt-1-10.txt',
       'txt-1-23.txt',
       'txt-1-32.txt',
       'txt-2-1.txt',
       'txt-2-32.txt']
      

      【讨论】:

        【解决方案4】:

        为了支持各种包含数字的文件名,您可以定义一个 sortKey 函数,该函数将隔离名称的数字部分并右对齐(使用前导零)以进行排序:

        import re
        def sortKey(n): 
            return "".join([s,f"{s:>010}"][s.isdigit()] for s in re.split(r"(\d+)",n))
        

        输出:

        names = ["text-1-1.txt","txt-1-23.txt","txt-1-32.txt","txt-1-10.txt",
                 "txt-2-1.txt","txt-2-32.txt"]
        
        print(sorted(names,key=sortKey))
        # ['text-1-1.txt', 'txt-1-10.txt', 'txt-1-23.txt', 'txt-1-32.txt', 
        #  'txt-2-1.txt', 'txt-2-32.txt']
        
        
        names = ["log2020/12/23.txt","log2021/1/3.txt","log2021/02/1.txt",
                 "log2021/1/1.txt","log2021/1/13.txt"]
        
        print(sorted(names,key=sortKey))
        # ['log2020/12/23.txt', 'log2021/1/1.txt', 'log2021/1/3.txt', 
        #  'log2021/1/13.txt', 'log2021/02/1.txt']
        

        【讨论】:

          猜你喜欢
          • 2012-07-07
          • 2015-04-06
          • 1970-01-01
          • 2010-10-29
          • 1970-01-01
          • 1970-01-01
          • 2011-08-27
          • 1970-01-01
          • 2021-06-07
          相关资源
          最近更新 更多