python - 按升序对目录中的文件名进行两级排序
问题描述
我有一个包含 .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() 首先是最重要的数字。
解决方案
您可以使用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']
请注意,该键使用正则表达式来查找字符串中的数字,您可以在此处找到有关它们的更多信息。
推荐阅读
- c# - 通过复制玩家位置跟随玩家的幽灵敌人 AI
- java - RecyclerView 只调用构造函数
- reactjs - Material-UI 在条件“覆盖”中使用默认值
- python - python:如何将矩阵实现为 column1=x column2=x^2... columnP=x^p
- rust - 序列化 Vec
使用 serde_cbor 到 Rust 中的 CBOR 字节字符串 - mysql - eXist-db 安装 MySQL 连接器
- unit-testing - 如何在 Azure Devops (Builds) 上显示详细的测试结果?
- winapi - 在堆栈上传递的参数没有被传递给被调用的函数
- python - Python中的Notch拒绝过滤
- javascript - 如何在javascript中计算语音时间