mrg*_*oom 6 python sorting list
例如,我有列表
my_list= ['image101.jpg', 'image2.jpg', 'image1.jpg']
Run Code Online (Sandbox Code Playgroud)
和
my_list.sort()
Run Code Online (Sandbox Code Playgroud)
给我
['image1.jpg', 'image101.jpg', 'image2.jpg']
Run Code Online (Sandbox Code Playgroud)
但我当然需要
['image1.jpg', 'image2.jpg', 'image101.jpg']
Run Code Online (Sandbox Code Playgroud)
怎么做?
fal*_*tru 11
list.sort
接受可选key
功能.每个项目都传递给函数,函数的返回值用于比较项目而不是原始值.
>>> my_list= ['image101.jpg', 'image2.jpg', 'image1.jpg']
>>> my_list.sort(key=lambda x: int(''.join(filter(str.isdigit, x))))
>>> my_list
['image1.jpg', 'image2.jpg', 'image101.jpg']
Run Code Online (Sandbox Code Playgroud)
filter
,str.isdigit
用于提取数字:
>>> ''.join(filter(str.isdigit, 'image101.jpg'))
'101'
>>> int(''.join(filter(str.isdigit, 'image101.jpg')))
101
Run Code Online (Sandbox Code Playgroud)
''.join(..)
在Python 2.x中不是必需的使用正则表达式从字符串中提取数字并转换为int:
import re
r = re.compile("\d+")
l = my_list= ['image101.jpg', 'image2.jpg', 'image1.jpg']
l.sort(key=lambda x: int(r.search(x).group()))
Run Code Online (Sandbox Code Playgroud)
或者使用更具体的正则表达式,包括.
:
import re
r = re.compile("(\d+)\.")
l = my_list= ['image101.jpg', 'image2.jpg', 'image1.jpg']
l.sort(key=lambda x: int(r.search(x).group()))
Run Code Online (Sandbox Code Playgroud)
两者都为您的示例输入提供相同的输出:
['image1.jpg', 'image2.jpg', 'image101.jpg']
Run Code Online (Sandbox Code Playgroud)
如果您确定扩展名,可以使用非常具体的正则表达式:
r = re.compile("(\d+)\.jpg$")
l.sort(key=lambda x: int(r.search(x).group(1)))
Run Code Online (Sandbox Code Playgroud)
如果你想在一般情况下这样做,我会尝试像natsort这样的自然排序包。
from natsort import natsorted
my_list = ['image101.jpg', 'image2.jpg', 'image1.jpg']
natsorted(my_list)
Run Code Online (Sandbox Code Playgroud)
返回:
['image1.jpg', 'image2.jpg', 'image101.jpg']
Run Code Online (Sandbox Code Playgroud)
您可以使用 pip ie 安装它 pip install natsort
归档时间: |
|
查看次数: |
1354 次 |
最近记录: |