Почему «Файл 10» идёт раньше «Файла 2»
Обычная сортировка сравнивает названия по буквам, а человек читает числа числами.
В чём дело
sorted(["Артикул 10", "Артикул 2", "Артикул 1"])
# ['Артикул 1', 'Артикул 10', 'Артикул 2']
Строки сравниваются посимвольно. Символ «1» идёт раньше «2», поэтому «10» оказывается раньше «2». Для программы верно, для человека — поломка.
Объяснить кладовщику про коды символов не выйдет. Это его список, и он должен выглядеть так, как он читает.
Решение
Разбить строку на куски букв и цифр, числа превратить в числа, сравнивать получившиеся списки:
import re
def klyuch(s):
chasti = re.split(r"(\d+)", s)
return [int(ch) if ch.isdigit() else ch.lower() for ch in chasti]
sorted(["Артикул 10", "Артикул 2"], key=klyuch)
# ['Артикул 2', 'Артикул 10']
re.split со скобками вокруг шаблона возвращает и сами
разделители — иначе числа просто выбросились бы, и сортировать стало
бы нечего.
Почему части не перепутаются по типу
Списки сравниваются поэлементно, и сравнить число со строкой Python откажется. Спасает то, что разбиение всегда начинается с не-цифрового куска — пусть и пустого. Поэтому на одинаковых позициях всегда оказываются части одного типа.
Где это нужно
Файловые менеджеры, списки версий, артикулы, номера домов, главы и разделы. Windows Explorer и Finder сортируют именно так, и люди к этому привыкли — а самодельный список вдруг нет.