按数字顺序对字符串列表进行排序

5

我有一个字符串列表,其中存储着我的文件名:

flist = ['0.png','10.png', '3.png', '4.png', '100.png']
flist.sort()
print(flist)

输出:

['0.png', '10.png', '100.png', '3.png', '4.png']

但我希望:

['0.png', '3.png', '4.png', '10.png', '100.png']

有没有简单的方法来实现这个?

4
可能是与此问题重复:Python 中有没有用于字符串自然排序的内置函数? - roganjosh
谢谢你的提示,但我认为这个线程上的解决方案不够简单。我知道我可以开始对我的文件名进行切片以实现目标,但我想知道是否有像Bruno Desthuilliers提供的简单方法。无论如何,还是谢谢。 - Artur Müller Romanov
是的,但您应该注意到给出的答案完全依赖于能够使用split()来隔离数值。重复项在整个范围的情况下都有效。您的问题标题(如果其他人在搜索中偶然发现此问题)掩盖了您具体的情况。 - roganjosh
另外,我不知道你所说的“不使用切片文件名”的意思是什么。你认为 split() 是用来做什么的? - roganjosh
2个回答

9

是的:

flist.sort(key=lambda fname: int(fname.split('.')[0]))

解释:字符串按字典顺序排序,因此 "10" 在 "3" 之前(因为 "1" < "3",所以忽略第一个字符串中 "1" 之后的任何内容)。因此我们使用 list.sort() 的 key 参数,这是一个回调函数,它接受一个列表项并返回用于对该项进行排序的值 - 在您的情况下,是从文件名的第一部分构建的整数。这样,列表就可以根据数字值正确排序。

3
你也可以这样做:

flist = ['0.png','10.png', '3.png', '4.png', '100.png']
flist.sort(key=lambda x: '{0:0>8}'.format(x))
print(flist)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接