Her ne sebeple olursa olsun Python, doğal sıralamaya sahip olmak için yerleşik bir yolla gelmez (1, 10, 2 yerine 1, 2, 10 anlamına gelir), bu yüzden kendiniz yazmalısınız:
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)
Artık bir listeyi sıralamak için bu işlevi kullanabilirsiniz:
dirlist = sorted_alphanumeric(os.listdir(...))
SORUNLAR:
Dizeleri (örneğin klasör adları) sıralamak için yukarıdaki işlevi kullanırsanız ve bunların Windows Gezgini gibi sıralanmasını isterseniz, bazı uç durumlarda düzgün çalışmayacaktır.
Bu sıralama işlevi, içinde belirli 'özel' karakterlerin bulunduğu klasör adlarınız varsa, Windows'ta yanlış sonuçlar döndürür. Örneğin, bu işlev sıralanırken 1, !1, !a, a
Windows Gezgini sıralayacaktır !1, 1, !a, a
.
Dolayısıyla, Windows Explorer'ın Python'da yaptığı gibi sıralamak istiyorsanız , Windows yerleşik işlevi StrCmpLogicalW'yi ctypes aracılığıyla kullanmanız gerekir (bu elbette Unix'te çalışmaz):
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))
Bu işlev biraz daha yavaştır sorted_alphanumeric()
.
Bonus: Windows'ta tam yollarıwinsort
da sıralayabilir .
Alternatif olarak, özellikle Unix kullanıyorsanız, tam yollara göre doğru bir şekilde (alt klasörler doğru konumda) sıralamak için natsort
library ( pip install natsort
) kullanabilirsiniz.
Tam yolları sıralamak için şu şekilde kullanabilirsiniz:
from natsort import natsorted, ns
dirlist = natsorted(dirlist, alg=ns.PATH | ns.IGNORECASE)
sorted_alphanumeric()
Yukarıdaki işlevden biraz daha yavaş olduğundan, yalnızca klasör adlarının (veya genel olarak dizelerin) normal sıralanması için kullanmayın . Windows Gezgini sıralaması bekliyorsanız
natsorted
kitaplık size yanlış sonuçlar verecektir , bunun için kullanın winsort()
.