按字符串中的数字对字符串列表进行排序?

jef*_*jef 8 python sorting string python-3.x

我有以下字符串列表。然后,我想按每个元素中的数字对其进行排序。sorted失败,因为它无法处理诸如 between10和之类的顺序3。我可以想象如果我使用re,我可以做到。但这并不有趣。你们有好的实现想法吗?我想这个代码的python 3.x。

names = [
'Test-1.model',
'Test-4.model',
'Test-6.model',
'Test-8.model',
'Test-10.model',
'Test-20.model'
]
number_sorted = get_number_sorted(names)
print(number_sorted)
'Test-20.model'
'Test-10.model'
'Test-8.model'
'Test-6.model'
'Test-4.model'
'Test-1.model'
Run Code Online (Sandbox Code Playgroud)

Bac*_*ics 6

关键是……关键

sorted(names, key=lambda x: int(x.partition('-')[2].partition('.')[0]))
Run Code Online (Sandbox Code Playgroud)

通过将其分离并将其转换为 int 来将字符串的那部分识别为排序顺序。


jpp*_*jpp 5

一些替代方案:

(1) 按位置切片:

sorted(names, key=lambda x: int(x[5:-6]))
Run Code Online (Sandbox Code Playgroud)

(2) 剥离子串:

sorted(names, key=lambda x: int(x.replace('Test-', '').replace('.model', '')))
Run Code Online (Sandbox Code Playgroud)

更好(Pandas 版本 >3.9):

x.removeprefix('Test-').removesuffix('.model')
Run Code Online (Sandbox Code Playgroud)

(3) 分割字符(也可以通过str.partition):

sorted(names, key=lambda x: int(x.split('-')[1].split('.')[0]))
Run Code Online (Sandbox Code Playgroud)

(4) 在 (1)-(3) 中的任意一个上使用 np.argsort 进行映射:

list(map(names.__getitem__, np.argsort([int(x[5:-6]) for x in names])))
Run Code Online (Sandbox Code Playgroud)