Вам нужна ключевая функция. Вы готовы указать 3 или 4 цифры в конце, и я чувствую, что вы хотите, чтобы они сравнивались численно.
sorted(list_, key=lambda s: (s[:-4], int(s[-4:])) if s[-4] in '0123456789' else (s[:-3], int(s[-3:])))
Без лямбды и условного выражения, это
def key(s):
if key[-4] in '0123456789':
return (s[:-4], int(s[-4:]))
else:
return (s[:-3], int(s[-3:]))
sorted(list_, key=key)
Это просто использует тот факт, что кортежи сортируются по первому элементу, а затем по второму. Так как функция key
вызывается для получения значения для сравнения, элементы теперь будут сравниваться как кортежи, возвращаемые функцией key. Например, 'asdfbad123'
будет сравниваться с 'asd7890'
, тогда как ('asdfbad', 123)
сравнивается с ('asd', 7890)
. Если последние 3 символа строки на самом деле не являются цифрами, вы получите ValueError, который совершенно уместен, учитывая тот факт, что вы передали ему данные, которые не соответствуют спецификациям, для которых он был разработан.