2024-09-29 01:36:29 发布
网友
是否有一种方法(如php的natsort)对一个由文件名组成的列表进行排序,这些文件名只在一个数字上有所不同,并且由glob未排序返回,例如:
test1.dat test7.dat . . test10.dat test3.dat
当我做一个天真的排序结果是
因为1发生在2之前:) 我可以用for循环和range(或者带有range的生成器)构造一些东西,但是这感觉有点不和谐。。。在
eumiro的回答是好的。我只想增加一种更灵活的方法:
def natural_sort(data): convert = lambda text: int(text) if text.isdigit() else text.lower() alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] return sorted(data, key=alphanum_key)
sorted(glob.glob('*.dat'), key=lambda x: int(x.split('.')[0][4:]))
这将获取文件名,去掉扩展名,并获取第四个位置后字符的整数值。为'测试xxx.dat'其中XXX是任意长度的整数。在
使用re(未测试)的解决方案:
prefix_number=re.compile(r'(.*)(\d+)\.dat$') def sortkey(ss): match=prefix_number.match(ss) if(match): return (match.group(0),int(match.group(1)) else: return (ss,) sorted(glob.iglob('*.dat'), key=sortkey )
此解决方案通过按前缀(例如“test”)和整数(例如1)拆分文件名。然后它首先按前缀排序,然后按整数排序。当然,缺点是您需要re和稍微复杂一些的解决方案。在
re
eumiro的回答是好的。我只想增加一种更灵活的方法:
这将获取文件名,去掉扩展名,并获取第四个位置后字符的整数值。为'测试xxx.dat'其中XXX是任意长度的整数。在
使用re(未测试)的解决方案:
此解决方案通过按前缀(例如“test”)和整数(例如1)拆分文件名。然后它首先按前缀排序,然后按整数排序。当然,缺点是您需要
re
和稍微复杂一些的解决方案。在相关问题 更多 >
编程相关推荐