En Python, ¿cómo puedo ordenar naturalmente una lista de cadenas alfanuméricas para que los caracteres alfa se ordenen por delante de los caracteres numéricos?
Este es un pequeño reto divertido que me enfrentó recientemente. Daré mi respuesta a continuación, pero tengo curiosidad por ver si hay soluciones más elegantes o eficientes.
Una delineación de los requisitos tal como me fueron presentados:
Las cadenas son alfanuméricas (consulte el conjunto de datos de prueba a continuación)Las cuerdas se deben clasificar de forma natural (veresta pregunta para explicación)Los caracteres alfa deben ordenarse por delante de los caracteres numéricos (es decir, 'abc' antes de '100')Las instancias en mayúsculas de los caracteres alfa deben ordenarse por delante de las instancias en minúsculas (es decir, 'ABc', 'Abc', 'abc')Aquí hay un conjunto de datos de prueba:
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']),
]
Caso de prueba de bonificación
Esto está inspirado enEl comentario de Janne Karila debajo de eso, la respuesta seleccionada falla actualmente (pero no sería realmente una preocupación práctica en mi caso):
(['0A', '00a', 'a', 'A', 'A0', '00A', '0', 'a0', '00', '0a'],
['A', 'a', 'A0', 'a0', '0', '00', '0A', '00A', '0a', '00a'])