如何对包含文件名的列表进行排序?

问题描述

我有一个大约 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"...]

另外,我知道有些文件名会以 1 递增,例如: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)?

解决方法

你可以这样运行:

import os

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

print(filelist)
,

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

>>> 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-2-32.txt']
,

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

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

为了支持各种包含数字的文件名,您可以定义一个 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-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']