В Python, как я могу естественным образом отсортировать список буквенно-цифровых строк так, чтобы буквенные символы сортировались перед числовыми?

Это забавное маленькое испытание, с которым я недавно столкнулся. Я предоставлю свой ответ ниже, но мне любопытно посмотреть, есть ли более элегантные или эффективные решения.

Разметка требований, как они были представлены мне:

Strings are alphanumeric (see test dataset below) Strings should be sorted naturally (see this question for explanation) Alpha characters should be sorted ahead of numeric characters (i.e. 'abc' before '100') Uppercase instances of alpha chars should be sorted ahead of lowercase instances (i.e. 'ABc', 'Abc', 'abc')

Вот набор тестовых данных:

test_cases = [
    # (unsorted list, sorted list)
    (list('bca'), ['a', 'b', 'c']),
    (list('CbA'), ['A', 'b', 'C']),
    (list('r0B9a'), ['a', 'B', 'r', '0', '9']),
    (['a2', '1a', '10a', 'a1', 'a100'], ['a1', 'a2', 'a100', '1a', '10a']),
    (['GAM', 'alp2', 'ALP11', '1', 'alp100', 'alp10', '100', 'alp1', '2'],
        ['alp1', 'alp2', 'alp10', 'ALP11', 'alp100', 'GAM', '1', '2', '100']),
    (list('ra0b9A'), ['A', 'a', 'b', 'r', '0', '9']),
    (['Abc', 'abc', 'ABc'], ['ABc', 'Abc', 'abc']),
]

Bonus Test Case

Это вдохновленоКомментарий Janne Karila ниже, что выбранный ответ в настоящее время не удается (но в моем случае это не будет практической проблемой):

(['0A', '00a', 'a', 'A', 'A0', '00A', '0', 'a0', '00', '0a'],
        ['A', 'a', 'A0', 'a0', '0', '00', '0A', '00A', '0a', '00a'])