W Pythonie, jak mogę naturalnie posortować listę ciągów alfanumerycznych w taki sposób, aby znaki alfanumeryczne sortowały się przed znakami numerycznymi?

To zabawne, małe wyzwanie, z którym ostatnio miałem do czynienia. Poniżej przedstawię swoją odpowiedź, ale jestem ciekawy, czy istnieją bardziej eleganckie i wydajne rozwiązania.

Nakreślenie wymagań, jakie zostały mi przedstawione:

Ciągi są alfanumeryczne (patrz zestaw danych testowych poniżej)Łańcuchy powinny być sortowane naturalnie (patrzto pytanie dla wyjaśnienia)Znaki alfa powinny być sortowane przed znakami numerycznymi (tj. „Abc” przed „100”)Duże litery znaków alfa należy sortować przed małymi literami (np. „ABc”, „Abc”, „abc”)

Oto zestaw danych testowych:

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']),
]

Bonusowa sprawa testowa

To jest inspirowane przezKomentarz Janne Karili poniżej, że wybrana odpowiedź zawodzi obecnie (ale w moim przypadku nie byłaby to praktyczna sprawa):

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

questionAnswers(3)

yourAnswerToTheQuestion