在Python中对包含路径的列表进行排序.

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)


Vin*_*ceP 8

使用自然排序(请参阅此问题):排序字符串时清除代码和良好实践.

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)

自然排序基于您如何在计算机屏幕上(按字母顺序和数字顺序)读取内容,而不是计算机如何读取代码.


Shi*_*hir 5

受到 @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