Python verfügt aus irgendeinem Grund nicht über eine integrierte Methode für eine natürliche Sortierung (dh 1, 2, 10 anstelle von 1, 10, 2). Sie müssen es also selbst schreiben:
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)
Mit dieser Funktion können Sie jetzt eine Liste sortieren:
dirlist = sorted_alphanumeric(os.listdir(...))
PROBLEME: Wenn
Sie die obige Funktion zum Sortieren von Zeichenfolgen (z. B. Ordnernamen) verwenden und möchten, dass diese wie im Windows Explorer sortiert werden, funktioniert dies in einigen Randfällen nicht ordnungsgemäß.
Diese Sortierfunktion gibt unter Windows falsche Ergebnisse zurück, wenn Sie Ordnernamen mit bestimmten Sonderzeichen enthalten. Diese Funktion wird beispielsweise sortiert 1, !1, !a, a
, während der Windows Explorer sortiert !1, 1, !a, a
.
Wenn Sie also genau wie Windows Explorer in Python sortieren möchten, müssen Sie die in Windows integrierte Funktion StrCmpLogicalW über ctypes verwenden (dies funktioniert natürlich nicht unter 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))
Diese Funktion ist etwas langsamer als sorted_alphanumeric()
.
Bonus: winsort
Kann auch vollständige Pfade unter Windows sortieren .
Alternativ, insbesondere wenn Sie Unix verwenden, können Sie die natsort
Bibliothek verwenden (pip install natsort
) verwenden, um nach vollständigen Pfaden auf korrekte Weise zu sortieren (dh Unterordner an der richtigen Position).
Sie können es so verwenden, um vollständige Pfade zu sortieren:
from natsort import natsorted, ns
dirlist = natsorted(dirlist, alg=ns.PATH | ns.IGNORECASE)
Verwenden Sie es nicht zum normalen Sortieren von Ordnernamen (oder Zeichenfolgen im Allgemeinen), da es etwas langsamer ist als die sorted_alphanumeric()
oben beschriebene Funktion.
natsorted
Die Bibliothek liefert falsche Ergebnisse, wenn Sie eine Windows Explorer-Sortierung erwarten. Verwenden Sie diese Option winsort()
.