Wie kann ich in Python auf natürliche Weise eine Liste alphanumerischer Zeichenfolgen sortieren, sodass Buchstaben vor numerischen Zeichen sortiert werden?

Dies ist eine lustige kleine Herausforderung, die mich in letzter Zeit konfrontiert hat. Ich werde meine Antwort unten geben, bin aber gespannt, ob es elegantere oder effizientere Lösungen gibt.

Eine Abgrenzung der Anforderungen, wie sie mir präsentiert wurden:

Zeichenfolgen sind alphanumerisch (siehe Testdatensatz unten)Saiten sollten natürlich sortiert sein (siehediese Frage zur Erklärung)Alpha-Zeichen sollten vor numerischen Zeichen sortiert werden (d. H. 'Abc' vor '100')Großbuchstaben von Buchstaben sollten vor Kleinbuchstaben sortiert werden (d. H. 'ABc', 'Abc', 'abc')

Hier ist ein Testdatensatz:

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 Testfall

Dies ist inspiriert vonKommentar von Janne Karila Darunter schlägt die ausgewählte Antwort derzeit fehl (wäre aber in meinem Fall kein praktisches Problem):

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage