我对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)
答案 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)