Вы можете попробовать следующий старый и классический способ:
import re
def numeric_compare(x, y):
u = re.findall("\d+(?:\.\d+)?", x)
v = re.findall("\d+(?:\.\d+)?", y)
u = [0] if len(u) == 0 else u
v = [0] if len(v) == 0 else v
return int(float(u[0]) - float(v[0]))
a = ['kernal_1.0.npy','kernal_100.npy','kernal_50.npy','kernal_10.npy' ]
print(a)
print(sorted(a, cmp=numeric_compare))
Вывод:
['kernal_1.0.npy', 'kernal_100.npy', 'kernal_50.npy', 'kernal_10.npy']
['kernal_1.0.npy', 'kernal_10.npy', 'kernal_50.npy', 'kernal_100.npy']
Пояснения:
- Вы определяете свою собственную функцию сортировки
numeric_compare
- Вы извлекаете действительные числа из сравниваемой строки
- Если ваша строка не содержит заданного вами числазначение
0
- Затем вы сравниваете оба извлеченных числа с плавающей точкой и приводите их обратно к
int
, так как вам нужно, чтобы ваша функция возвращала int
- Вы вызываете
sorted()
в вашем списке с функцией сравнения
Этот способ является надежным и также работает с файлом, в котором нет ни одного числа:
input:
b = ['kernal_1.0.npy','kernal_100.npy','kernal_50.npy','kernal_10.npy', 'abc' ]
вывод:
['abc', 'kernal_1.0.npy', 'kernal_10.npy', 'kernal_50.npy', 'kernal_100.npy']
Если вы предпочитаете, чтобы файлы, в которых не было номеров, появлялись в конце списка вместоПосле сортировки в начале вы можете заменить u = [0]
и v = [0]
на u = [sys.maxsize]
и v = [sys.maxsize]
.(вам нужно добавить import sys
в начале вашего кода)
Демонстрация Regex и пояснения :
https://regex101.com/r/evIeVD/1/