问题描述
我有一个大约 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)
,
您可以为此创建一个自定义函数,从文件名创建 tuple
的 int
:
>>> 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']