按编号对文件名列表进行排序

时间:2012-06-08 10:34:32

标签: string sorting python numeric

有没有办法(比如php的natsort)对由文件名组成的列表进行排序,这些文件名只有一个数字不同,并且不会被glob返回,例如:

test1.dat
test7.dat
.
.
test10.dat
test3.dat

当我做一个天真的排序时,结果是

test1.dat
test10.dat
test2.dat
.
.
.

因为1发生在2之前:) 我可以使用for循环和范围(或带范围的发生器)构建一些东西,但这感觉有点不合理......

3 个答案:

答案 0 :(得分:4)

sorted(glob.glob('*.dat'), key=lambda x: int(x.split('.')[0][4:]))

这将采用文件名,剥离扩展名并取第四个位置后的字符的整数值。适用于'testXXX.dat',其中XXX是任意长度的整数。

答案 1 :(得分:0)

使用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和稍微复杂的解决方案。

答案 2 :(得分:0)

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)