Python, por la razón que sea, no viene con una forma incorporada de tener una clasificación natural (es decir, 1, 2, 10 en lugar de 1, 10, 2), por lo que debe escribirlo usted mismo:
import re
def sorted_alphanumeric(data):
convert = lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
return sorted(data, key=alphanum_key)
Ahora puede usar esta función para ordenar una lista:
dirlist = sorted_alphanumeric(os.listdir(...))
PROBLEMAS:
En caso de que utilice la función anterior para ordenar cadenas (por ejemplo, nombres de carpetas) y desee ordenarlas como lo hace el Explorador de Windows, no funcionará correctamente en algunos casos extremos.
Esta función de clasificación devolverá resultados incorrectos en Windows, si tiene nombres de carpeta con ciertos caracteres 'especiales' en ellos. Por ejemplo, esta función ordenará 1, !1, !a, a
, mientras que el Explorador de Windows ordenará !1, 1, !a, a
.
Entonces, si desea ordenar exactamente como lo hace el Explorador de Windows en Python , debe usar la función incorporada de Windows StrCmpLogicalW a través de ctypes (esto, por supuesto, no funcionará en Unix):
from ctypes import wintypes, windll
from functools import cmp_to_key
def winsort(data):
_StrCmpLogicalW = windll.Shlwapi.StrCmpLogicalW
_StrCmpLogicalW.argtypes = [wintypes.LPWSTR, wintypes.LPWSTR]
_StrCmpLogicalW.restype = wintypes.INT
cmp_fnc = lambda psz1, psz2: _StrCmpLogicalW(psz1, psz2)
return sorted(data, key=cmp_to_key(cmp_fnc))
Esta función es un poco más lenta que sorted_alphanumeric()
.
Bonificación: winsort
también puede ordenar rutas completas en Windows .
Alternativamente, especialmente si usa Unix, puede usar la natsort
biblioteca ( pip install natsort
) para ordenar por rutas completas de manera correcta (es decir, subcarpetas en la posición correcta).
Puede usarlo así para ordenar rutas completas:
from natsort import natsorted, ns
dirlist = natsorted(dirlist, alg=ns.PATH | ns.IGNORECASE)
No lo use para la clasificación normal de solo nombres de carpetas (o cadenas en general), ya que es un poco más lento que la sorted_alphanumeric()
función anterior.
natsorted
la biblioteca le dará resultados incorrectos si espera la clasificación del Explorador de Windows, así que úselo winsort()
para eso.