python sorting natsort

Análogo de Python de la función natsort de PHP(ordene una lista usando un algoritmo de "orden natural")



sorting (3)

Me gustaría saber si hay algo similar a la función PHP natsort en Python?

l = [''image1.jpg'', ''image15.jpg'', ''image12.jpg'', ''image3.jpg''] l.sort()

da:

[''image1.jpg'', ''image12.jpg'', ''image15.jpg'', ''image3.jpg'']

pero me gustaría conseguir:

[''image1.jpg'', ''image3.jpg'', ''image12.jpg'', ''image15.jpg'']

ACTUALIZAR

Base de soluciones en este enlace.

def try_int(s): "Convert to integer if possible." try: return int(s) except: return s def natsort_key(s): "Used internally to get a tuple by which s is sorted." import re return map(try_int, re.findall(r''(/d+|/D+)'', s)) def natcmp(a, b): "Natural string comparison, case sensitive." return cmp(natsort_key(a), natsort_key(b)) def natcasecmp(a, b): "Natural string comparison, ignores case." return natcmp(a.lower(), b.lower()) l.sort(natcasecmp);


De mi respuesta al algoritmo de clasificación natural :

import re def natural_key(string_): """See http://www.codinghorror.com/blog/archives/001018.html""" return [int(s) if s.isdigit() else s for s in re.split(r''(/d+)'', string_)]

Ejemplo:

>>> L = [''image1.jpg'', ''image15.jpg'', ''image12.jpg'', ''image3.jpg''] >>> sorted(L) [''image1.jpg'', ''image12.jpg'', ''image15.jpg'', ''image3.jpg''] >>> sorted(L, key=natural_key) [''image1.jpg'', ''image3.jpg'', ''image12.jpg'', ''image15.jpg'']

Para admitir cadenas de Unicode, se debe usar .isdigit() lugar de .isdigit() . Ver ejemplo en el comentario de @phihag . Relacionado: Cómo revelar la propiedad del valor numérico de Unicodes .

.isdigit() también puede fallar (valor devuelto que no es aceptado por int() ) para un bytestring en Python 2 en algunas configuraciones regionales, por ejemplo, ''/ xb2'' (''²'') en la configuración regional cp1252 en Windows .


Esta función se puede usar como el argumento key= para sorted en Python 2.xy 3.x:

def sortkey_natural(s): return tuple(int(part) if re.match(r''[0-9]+$'', part) else part for part in re.split(r''([0-9]+)'', s))


Puede consultar la biblioteca natsort terceros en PyPI:

>>> import natsort >>> l = [''image1.jpg'', ''image15.jpg'', ''image12.jpg'', ''image3.jpg''] >>> natsort.natsorted(l) [''image1.jpg'', ''image3.jpg'', ''image12.jpg'', ''image15.jpg'']

Revelación completa, soy el autor.