Python list.sort()不工作/显示奇怪的行为

时间:2016-05-16 17:18:39

标签: python list sorting

我对Python list.sort()函数有一个非常奇怪的问题。

在我的程序中,我通过os.listdir()获取了一个文件列表。这将返回类似

的内容
['0.jpg', '1.jpg', '10.jpg', '11.jpg', '12.jpg', '13.jpg', '14.jpg', '15.jpg', '16.jpg', '17.jpg', '18.jpg', '19.jpg', '2.jpg', '20.jpg'] 

(这个列表的问题是,倒数第二个元素应该位于第三个位置,3.jpg - 9.jpg位于列表末尾的某个位置。) 现在我想得到这个列表中的最后一个元素(编号最高的那个),所以我做list.sort()

奇怪的是,这对列表没有任何作用。我还尝试了sorted(list),它也返回完全相同的列表。所以我打开了解释器并告诉它对列表["3.jpg","2.jpg","5.jpg"]进行排序,由于某种原因做了工作。

所以我的问题是:任何人请告诉我为什么python没有排序第一个列表,但第二个是好的?另外,我如何解决这个问题,是否有一些解决方法?

如果有人感兴趣:这是我的代码:

li=os.listdir("screenshots")
li.sort()
print(li)

2 个答案:

答案 0 :(得分:3)

Python在词法排序中对字符串进行排序。 “10”在“2”之前出现,因为1< 2。

为了更改列表的排序方式,您可以使用key=参数。假设文件名只是数字,您可以使用

li.sort(key=lambda x: int(x.split(".")[0]))

这会分离出文件名并将其转换为数字,然后使用该数字作为排序键。

答案 1 :(得分:1)

你想要的是natural sort。您可以使用此代码(来自here):

在python中进行自然排序
import re

def natural_sort(l): 
    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(l, key=alphanum_key)