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)
关键是……关键
sorted(names, key=lambda x: int(x.partition('-')[2].partition('.')[0]))
Run Code Online (Sandbox Code Playgroud)
通过将其分离并将其转换为 int 来将字符串的那部分识别为排序顺序。
一些替代方案:
(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)