在python中对包含数字的字符串列表进行排序

2024-10-06 16:20:11 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个字符串路径列表:

x = ['../../scene/temp_5a/458754/1_car.png',
     '../../scene/temp_5a/458754/2_car.png',
     '../../scene/temp_5a/458754/10_car.png',
     '../../scene/temp_5a/458754/15_car.png',
     '../../scene/temp_5a/458754/3_car.png']

我需要按_car前面的数字排序。有人知道一个快速的方法吗?你知道吗

我目前有这个,但似乎是分裂得到所有的数字。我只想得到_car前面的数字。你知道吗

def atoi(text):
    return int(text) if text.isdigit() else text

def natural_keys(text):
    return [ atoi(c) for c in re.split('(\d+)', text) ]

x.sort(key=natural_keys) # gives an error

Tags: 字符串text路径列表return排序pngdef
3条回答

我不知道为什么你的正则表达式给你一个错误,它对我有用。或者换个正则表达式?你知道吗

r'.*\/([^_]*)_.*'替换你的也可以:

x = ['../../scene/temp_5a/458754/1_car.png',
'../../scene/temp_5a/458754/2_car.png',
'../../scene/temp_5a/458754/10_car.png',
'../../scene/temp_5a/458754/15_car.png',
'../../scene/temp_5a/458754/3_car.png']

def atoi(text):
return int(text) if text.isdigit() else text

def natural_keys(text):
    return [ atoi(c) for c in re.split(r'.*\/([^_]*)_.*', text) ]

x.sort(key=natural_keys)
print x

输出:

['../../scene/temp_5a/458754/1_car.png',  
'../../scene/temp_5a/458754/2_car.png', 
'../../scene/temp_5a/458754/3_car.png', 
'../../scene/temp_5a/458754/10_car.png', 
'../../scene/temp_5a/458754/15_car.png']
x = ['../../scene/temp_5a/458754/1_car.png',
'../../scene/temp_5a/458754/2_car.png',
'../../scene/temp_5a/458754/10_car.png',
'../../scene/temp_5a/458754/15_car.png',
'../../scene/temp_5a/458754/3_car.png']
sorted(x,key=lambda x: int(x.split('/')[-1].split('_car')[0]))

Out[118]: 
['../../scene/temp_5a/458754/1_car.png',
 '../../scene/temp_5a/458754/2_car.png',
 '../../scene/temp_5a/458754/3_car.png',
 '../../scene/temp_5a/458754/10_car.png',
 '../../scene/temp_5a/458754/15_car.png']

我的方法是拆分字符串并使用_car前面的数字作为key进行比较。你知道吗

>>> x = [
...     '../../scene/temp_5a/458754/1_car.png',
...     '../../scene/temp_5a/458754/2_car.png',
...     '../../scene/temp_5a/458754/10_car.png',
...     '../../scene/temp_5a/458754/15_car.png',
...     '../../scene/temp_5a/458754/3_car.png']
>>>
>>> sorted(x,key=lambda i: int(i.split('/')[-1].split('_')[0]))
[[1, '../../scene/temp_5a/458754/1_car.png'], [2, '../../scene/temp_5a/458754/2_car.png'], [3, '../../scene/temp_5a/458754/3_car.png'], [10, '../../scene/temp_5a/458754/10_car.png'], [15, '../../scene/temp_5a/458754/15_car.png']]

相关问题 更多 >