根据字符串中的数字排序字符串列表

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中不是必需的

  • 只是想提一下,如果文件名是`image21_20160328.jpg`就行不通.它将提取的数字是"2120160328". (2认同)

Pad*_*ham 7

使用正则表达式从字符串中提取数字并转换为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)

  • 您需要将匹配的字符串转换为数字.否则,结果与OP想要的结果不同.`['image1.jpg','image101.jpg','image2.jpg']!= ['image1.jpg','image2.jpg','image101.jpg']` (4认同)

reu*_*pen 6

如果你想在一般情况下这样做,我会尝试像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