在Python中按数字顺序排序文件名
大家好,我最近在学习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']