Var*_*run 5 python sorting python-2.7
我有一个列表paths_list,其中包含特定文件夹的文件(图像)的路径.例:
['/home/username/images/s1/4.jpg', '/home/username/images/s1/7.jpg', '/home/username/images/s1/6.jpg', '/home/username/images/s1/3.jpg', '/home/username/images/s1/5.jpg', '/home/username/images/s1/10.jpg', '/home/username/images/s1/9.jpg', '/home/username/images/s1/1.jpg', '/home/username/images/s1/2.jpg', '/home/username/images/s1/12.jpg', '/home/username/images/s1/11.jpg', '/home/username/images/s1/8.jpg']
我想按顺序[/1.jpg ,2.jpg .....,/12.jpg]
排序:既不按长度排序也不按字母顺序排序都有帮助.这应该做什么?
Cor*_*mer 14
您可以使用sorted一个lambda.对于排序条件,您可以先使用os文件名(使用basename),然后您可以只删除文件名而不是扩展名(使用splitext),最后转换为int以数字方式排序而不是按字典顺序排序.
>>> import os
>>> l = ['/home/username/images/s1/4.jpg', '/home/username/images/s1/7.jpg', '/home/username/images/s1/6.jpg', '/home/username/images/s1/3.jpg', '/home/username/images/s1/5.jpg', '/home/username/images/s1/10.jpg', '/home/username/images/s1/9.jpg', '/home/username/images/s1/1.jpg', '/home/username/images/s1/2.jpg', '/home/username/images/s1/12.jpg', '/home/username/images/s1/11.jpg', '/home/username/images/s1/8.jpg']
>>> sorted(l, key=lambda i: int(os.path.splitext(os.path.basename(i))[0]))
['/home/username/images/s1/1.jpg',
'/home/username/images/s1/2.jpg',
'/home/username/images/s1/3.jpg',
'/home/username/images/s1/4.jpg',
'/home/username/images/s1/5.jpg',
'/home/username/images/s1/6.jpg',
'/home/username/images/s1/7.jpg',
'/home/username/images/s1/8.jpg',
'/home/username/images/s1/9.jpg',
'/home/username/images/s1/10.jpg',
'/home/username/images/s1/11.jpg',
'/home/username/images/s1/12.jpg']
Run Code Online (Sandbox Code Playgroud)
使用自然排序(请参阅此问题):排序字符串时清除代码和良好实践.
from natsort import natsorted
l = ['/home/username/images/s1/4.jpg', '/home/username/images/s1/7.jpg', '/home/username/images/s1/6.jpg', '/home/username/images/s1/3.jpg', '/home/username/images/s1/5.jpg', '/home/username/images/s1/10.jpg', '/home/username/images/s1/9.jpg', '/home/username/images/s1/1.jpg', '/home/username/images/s1/2.jpg', '/home/username/images/s1/12.jpg', '/home/username/images/s1/11.jpg', '/home/username/images/s1/8.jpg']
natsorted(l)
Run Code Online (Sandbox Code Playgroud)
给
['/home/username/images/s1/1.jpg',
'/home/username/images/s1/2.jpg',
'/home/username/images/s1/3.jpg',
'/home/username/images/s1/4.jpg',
'/home/username/images/s1/5.jpg',
'/home/username/images/s1/6.jpg',
'/home/username/images/s1/7.jpg',
'/home/username/images/s1/8.jpg',
'/home/username/images/s1/9.jpg',
'/home/username/images/s1/10.jpg',
'/home/username/images/s1/11.jpg',
'/home/username/images/s1/12.jpg']
Run Code Online (Sandbox Code Playgroud)
自然排序基于您如何在计算机屏幕上(按字母顺序和数字顺序)读取内容,而不是计算机如何读取代码.
受到 @Cory Kramer 答案的启发,您可以使用该pathlib库并获得自然的路径排序:
from pathlib import Path
a = ['/home/username/images/s1/4.jpg',
'/home/username/images/s1/7.jpg',
'/home/username/images/s1/6.jpg',
'/home/username/images/s1/3.jpg',
'/home/username/images/s1/5.jpg',
'/home/username/images/s1/10.jpg',
'/home/username/images/s1/9.jpg',
'/home/username/images/s1/1.jpg',
'/home/username/images/s1/2.jpg',
'/home/username/images/s1/12.jpg',
'/home/username/images/s1/11.jpg',
'/home/username/images/s1/8.jpg']
a = [Path(i) for i in a]
sorted_a = sorted(a, key=lambda i: int(i.stem))
sorted_a = [str(i) for i in a]
Run Code Online (Sandbox Code Playgroud)
输出:
['/home/username/images/s1/1.jpg',
'/home/username/images/s1/2.jpg',
'/home/username/images/s1/3.jpg',
'/home/username/images/s1/4.jpg',
'/home/username/images/s1/5.jpg',
'/home/username/images/s1/6.jpg',
'/home/username/images/s1/7.jpg',
'/home/username/images/s1/8.jpg',
'/home/username/images/s1/9.jpg',
'/home/username/images/s1/10.jpg',
'/home/username/images/s1/11.jpg',
'/home/username/images/s1/12.jpg']
Run Code Online (Sandbox Code Playgroud)
一般来说,使用pathlib有时可以提供比plane更清晰的代码表达式os.path。