在Python中按数字顺序排序文件名

1 投票
3 回答
3683 浏览
提问于 2025-04-17 21:33

大家好,我最近在学习Python。

我在按数字顺序排序文件时遇到了问题。我有一个文件列表,顺序是这样的:

["1card.txt", "card.txt" , "3card.txt", "52card.txt", "badcard.txt"]

但是当我直接打印这个列表时,它并没有按照我想要的顺序打印出来,而是打印成了:1card.txt, 10card.txt,依此类推。那么我该如何修正下面的代码呢?

file=glob.glob('/directory/*.txt')
sorted(file, key=int)

3 个回答

0

一个简单的解决办法,不需要用到正则表达式,可以这样做:

def sort_int(examp):
    pos = 1
    while examp[:pos].isdigit():
        pos += 1
    return examp[:pos-1] if pos > 1 else examp

sorted(files, key=sort_int)

['1card.txt', '3card.txt', '52card.txt', 'badcard.txt', 'card.txt']

0
files = ["1card.txt", "card.txt" , "3card.txt", "52card.txt", "badcard.txt"]

def nat_sort(s):
    '''
    provides a sort mechanism for strings that may or 
    may not lead with an integer
    '''
    for i, c in enumerate(s):
        if not c.isdigit():
            break
    if not i:
        return 0, s
    else:
        return int(s[:i]), s[i:]

files.sort(key=nat_sort)

现在,files 是一个已经排序好的列表:

['badcard.txt', 'card.txt', '1card.txt', '3card.txt', '52card.txt']

如果想要把相似的字母放在一起排序,可以按照上面的方式做:

def nat_sort(s):
    '''
    provides a sort mechanism for strings that may or 
    may not lead with an integer, but groups by strings 
    starting after integers, if any
    '''
    for i, c in enumerate(s):
        if not c.isdigit():
            break
    if not i:
        return s, 0
    else:
        return  s[i:], int(s[:i])

files.sort(key=nat_sort)

现在,files 返回的是:

['badcard.txt', 'card.txt', '1card.txt', '3card.txt', '52card.txt']
2

这样怎么样:

import re

def tryint(s):
    try:
        return int(s)
    except ValueError:
        return s

def alphanum_key(s):
    return [tryint(c) for c in re.split('([0-9]+)', s)]

def sort_nicely(l):
    return sorted(l, key=alphanum_key)

然后你可以这样做:

>>> file = ["1card.txt", "card.txt" , "3card.txt", "52card.txt", "badcard.txt"]
>>> sort_nicely(file)
['1card.txt', '3card.txt', '52card.txt', 'badcard.txt', 'card.txt']

撰写回答