首页 > 解决方案 > 按升序对目录中的文件名进行两级排序

问题描述

我有一个包含 .jpg 文件(来自不同视频文件的帧)的目录。文件名看起来像 'frame_{}_{}'.format(number_of_video, frame_number)。例如:'frame_1_1234.jpg'

如何通过两级排序按升序对文件进行排序?首先是 number_of_video,其次是 frame_number。

现在我有这个:

['frame_0_0.jpg','frame_0_1.jpg','frame_0_10.jpg','frame_0_100.jpg','frame_0_1000.jpg','frame_0_1001.jpg','frame_0_1002.jpg','frame_0_1003.jpg','frame_0_1004.jpg','frame_0_1005.jpg','frame_0_1006.jpg','frame_0_1007.jpg',...]

我想要这个:

['frame_0_0.jpg', 'frame_0_1.jpg', 'frame_0_2.jpg',..., 'frame_1_0.jpg', 'frame_1_1.jpg', 'frame_1_2.jpg',...]

显然 .sorted() 首先是最重要的数字。

标签: pythonsorting

解决方案


您可以使用sortedkey的参数:

import re


def key(value):
    """Extract numbers from string and return a tuple of the numeric values"""
    return tuple(map(int, re.findall('\d+', value)))


values = ['frame_0_0.jpg', 'frame_0_1.jpg', 'frame_0_10.jpg', 'frame_0_100.jpg',
          'frame_0_1000.jpg', 'frame_0_1001.jpg', 'frame_0_1002.jpg', 'frame_0_1003.jpg',
          'frame_0_1004.jpg', 'frame_0_1005.jpg', 'frame_0_1006.jpg', 'frame_0_1007.jpg']

result = sorted(values, key=key)
print(result)

输出

['frame_0_0.jpg', 'frame_0_1.jpg', 'frame_0_10.jpg', 'frame_0_100.jpg', 'frame_0_1000.jpg', 'frame_0_1001.jpg', 'frame_0_1002.jpg', 'frame_0_1003.jpg', 'frame_0_1004.jpg', 'frame_0_1005.jpg', 'frame_0_1006.jpg', 'frame_0_1007.jpg']

请注意,该键使用正则表达式来查找字符串中的数字,您可以在此处找到有关它们的更多信息。


推荐阅读