按文件基名称对路径列表排序(Python)

按文件基名称对路径列表排序(Python),python,sorting,Python,Sorting,我有一个包含图像的文件夹。 我在列表中添加了每个图像的路径。它们不是按字母顺序排序的。 我使用此函数进行排序,但我发现排序后打印列表时的结果是一样的 import os import glob images_path = os.path.expanduser('~\\Desktop\\samples\\') def img_path_list(): img_list = [] for file_path in glob.glob(str(images_path) + "*.j

我有一个包含图像的文件夹。 我在列表中添加了每个图像的路径。它们不是按字母顺序排序的。 我使用此函数进行排序,但我发现排序后打印列表时的结果是一样的

import os
import glob

images_path = os.path.expanduser('~\\Desktop\\samples\\')

def img_path_list():
    img_list = []
    for file_path in glob.glob(str(images_path) + "*.jpg"):
        img_list.append(file_path)

    img_list.sort(key=lambda x: str(x.split('.')[0]))

    return img_list

print(img_path_list())
结果仍然是:
[Desktop\\t0.jpg,Desktop\\t1.jpg,Desktop\\t10.jpg,Desktop\\t11.jpg,Desktop\\t2.jpg,…]


编辑:不重复,只要我没有请求使用
natsort
模块,而是使用简单的python。

使用
os.path.basename
,并假设您的文件名都是
X#.jpg
格式,只包含
X
一个字符:

import os

img_list = ['Desktop\\t0.jpg', 'Desktop\\t1.jpg',
            'Desktop\\t10.jpg', 'Desktop\\t11.jpg',
            'Desktop\\t2.jpg']

img_list.sort(key=lambda x: int(os.path.basename(x).split('.')[0][1:]))

print(img_list)

['Desktop\\t0.jpg', 'Desktop\\t1.jpg',
 'Desktop\\t2.jpg', 'Desktop\\t10.jpg',
 'Desktop\\t11.jpg']
使用命名函数说明
lambda
的工作原理:

def sorter(x):
    return int(os.path.basename(x).split('.')[0][1:])

img_list.sort(key=sorter)
解释

这里有几个步骤:

  • 通过
    os.path.basename
    提取文件名
  • 拆分并提取第一个元素
  • 然后从第一个字符开始切片
  • 将结果转换为
    int
    进行数字排序

  • 使用
    os.path.basename
    并假设您的文件名都是
    X#.jpg
    格式,并使用
    X
    单个字符:

    import os
    
    img_list = ['Desktop\\t0.jpg', 'Desktop\\t1.jpg',
                'Desktop\\t10.jpg', 'Desktop\\t11.jpg',
                'Desktop\\t2.jpg']
    
    img_list.sort(key=lambda x: int(os.path.basename(x).split('.')[0][1:]))
    
    print(img_list)
    
    ['Desktop\\t0.jpg', 'Desktop\\t1.jpg',
     'Desktop\\t2.jpg', 'Desktop\\t10.jpg',
     'Desktop\\t11.jpg']
    
    使用命名函数说明
    lambda
    的工作原理:

    def sorter(x):
        return int(os.path.basename(x).split('.')[0][1:])
    
    img_list.sort(key=sorter)
    
    解释

    这里有几个步骤:

  • 通过
    os.path.basename
    提取文件名
  • 拆分并提取第一个元素
  • 然后从第一个字符开始切片
  • 将结果转换为
    int
    进行数字排序

  • 结果在我看来很有条理。你想让t2.jpg先于t10.jpg吗?结果就是一个例子。是的,正常分拣。123而不是1、10、2、20等…
    EDIT:…
    抱歉,我们不关心您的限制。请理解,您希望对某些内容进行自然排序。无论您是否要求外部模块,这个问题以前已经被问过了。所以不管这是不是你的家庭作业,它都是重复的。结果在我看来非常有序。你想让t2.jpg先于t10.jpg吗?结果就是一个例子。是的,正常分拣。123而不是1、10、2、20等…
    EDIT:…
    抱歉,我们不关心您的限制。请理解,您希望对某些内容进行自然排序。无论您是否要求外部模块,这个问题以前已经被问过了。所以不管这是不是你的家庭作业,它都是重复的。这就是答案。仍然需要了解lamba函数及其工作原理。@Link,
    lambda
    只是一个匿名函数。我将给出一个命名函数的等效示例。非常好。再次感谢。这就是答案。仍然需要了解lamba函数及其工作原理。@Link,
    lambda
    只是一个匿名函数。我将给出一个命名函数的等效示例。非常好。再次感谢。