【问题标题】:Sort list of paths by file basename (Python) [duplicate]按文件基名排序路径列表(Python)[重复]
【发布时间】:2018-06-16 20:41:34
【问题描述】:

我有一个包含图片的文件夹。 我将每个图像的路径添加到列表中。它们不是按字母顺序排序的。 我做了这个函数来排序,但是排序后打印列表的结果是一样的。

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,就不是重复的。

【问题讨论】:

  • 结果对我来说看起来很有序。你想在 t10.jpg 之前有 t2.jpg?
  • 结果是一个例子。是的,正常排序。 123 而不是 1、10、2、20 等。
  • EDIT: ... 抱歉,我们不关心您的限制。
  • 了解您希望对某事进行自然排序。无论您是否要求使用外部模块,这个问题都曾被问过。所以它是重复的,不管这是否是你的作业。

标签: python sorting


【解决方案1】:

使用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)

说明

这里有几个步骤:

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

【讨论】:

  • 这就是答案。仍然需要了解lamba函数及其工作原理。
  • @Link, lambda 只是一个匿名函数。我将给出一个具有命名函数的等效示例。
  • 非常好。再次感谢。
猜你喜欢
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 2015-11-14
  • 2022-01-27
  • 1970-01-01
相关资源
最近更新 更多