为了账号安全,请及时绑定邮箱和手机立即绑定

按顺序组织列表中的元素

按顺序组织列表中的元素

忽然笑 2022-11-29 14:52:11
我正在加载 700 张图像,我需要它们按照名称的顺序排列(_DCS6825_01、_DCS6825_02...),但是当尝试这样做时,在图像 _DCS6825_10 之后,下一个要加载的是图像 _DCS6825_100,然后是 _DCS6825_101图片 11(_DCS6825_11),我该如何解决。这是我的代码:from PIL import Imageimport globimport matplotlib.pyplot as pltimport ospath = 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'谢谢您的帮助
查看完整描述

1 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

你在这里有两个问题:


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


path = r'...'

image_list = glob.glob(path + '*.jpg')

sortedlist = sorted(image_list)

loaded_images = []

for filename in image_list:

    im = Image.open(filename)

    loaded_images.append(im)


第二个是当您对列表进行排序时,sorted使用文件名,从而使用字母顺序,而不是像您想要的那样使用文件名的最后一个数字进行排序。


我建议在这里使用自定义键对列表进行不同的排序。假设文件名始终遵循相同的模式_DSC<number1>_<number2>.<ext>,您希望根据 对文件进行排序number2,您可以使用:


sortedlist = sorted(

        image_list,

        key=lambda filename: int(filename.split('_')[-1].split('.')[0])

    )

此处的 lambda 将针对它获取的每个元素(在本例中为文件名)拆分_为最后一个元素,因此在本例中为最后一个数字,不带扩展名(因此为.split('.')[0])并将其转换为 int 以删除过多的开头的零能够正确排序。


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


希望这可以帮助!


查看完整回答
反对 回复 2022-11-29
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号