Python 按顺序组织列表中的元素

Python 按顺序组织列表中的元素,python,list,sorting,Python,List,Sorting,我正在加载700个图像,我需要它们按照名称的顺序排列(_DCS6825_01,_DCS6825_02…),但是当尝试这样做时,在加载图像之后,下一个加载的是图像_DCS6825_100,然后_DCS6825_101而不是图片11(_DCS6825_11),我如何解决这个问题。 这是我的代码: from PIL import Image import glob import matplotlib.pyplot as plt import os path = r'C:\Users\juanc\De

我正在加载700个图像,我需要它们按照名称的顺序排列(_DCS6825_01,_DCS6825_02…),但是当尝试这样做时,在加载图像之后,下一个加载的是图像_DCS6825_100,然后_DCS6825_101而不是图片11(_DCS6825_11),我如何解决这个问题。 这是我的代码:

from PIL import Image
import glob
import matplotlib.pyplot as plt
import os

path = r'C:\Users\juanc\Desktop\prueba origen\restich\\'
image_list = []
for filename in glob.glob(path+'*.jpg'):
    im=Image.open(filename)
    image_list.append(im)
sortedlist = sorted(image_list)
print(sortedlist)
排序结果产生了一个错误:

TypeError: '<' not supported between instances of 'JpegImageFile' and 'JpegImageFile'

TypeError:“这里有两个问题:

首先,您试图对图像本身进行排序,而不是使用它们的文件名。正如评论中所指出的,您应该首先对列表进行排序,然后加载图像:

path=r'…'
image_list=glob.glob(路径+'*.jpg')
sortedlist=已排序(图像列表)
已加载的_图像=[]
对于图像列表中的文件名:
im=Image.open(文件名)
加载的图片。附加(im)
第二个问题是,在对列表进行排序时,
sorted
使用文件名,因此使用字母顺序,而不是像您希望的那样使用文件名的最后一个数字进行排序

我建议在这里使用自定义键对列表进行不同的排序。假设文件名始终遵循相同的模式
\u DSC.
,您希望根据
编号2
对文件进行排序,您可以使用:

sortedlist=已排序(
图片列表,
key=lambda文件名:int(filename.split(“”“)[-1]。split(‘.)[0])
)
这里的lambda将,对于它得到的每个元素,在本例中是文件名,在
\uu
上分割,取最后一个元素,因此在本例中是最后一个数字,没有扩展名(因此是
.split('.)[0]
),并将其强制转换为int,以删除开头多余的零,从而能够正确排序

请注意,只有当所有文件名都遵循相同的模式时,这才有效,否则,您可能会遇到其他问题


希望这有帮助

与其先读取所有图像,然后进行排序,不如先对文件名进行排序,然后按顺序读取图像。这是否回答了您的问题?完美的谢谢,真的很有帮助。只是一个注释,字符串的拆分必须是双重的,因为它在“.jpg”中完成,所以最后它是:sortedlist=sorted(image_list,key=lambda im:int((im.split(''.'[-1])。split('.')[0])太好了!哦,是的,移除扩展是件好事,否则整个事情将毫无用处。。。我已经根据你的评论更新了我的答案。请注意,因为
im.split(''u')[-1]
返回一个str(当然,如果拆分成功),所以在进行第二次拆分之前,不需要将其括在括号中,您可以将它们链接起来:
sortedlist=sorted(image\u list,key=lambda im:int(im.split(''u')[-1].split('.')[0])