Python untuk alasan apa pun tidak dilengkapi dengan cara bawaan untuk memiliki pengurutan alami (artinya 1, 2, 10, bukan 1, 10, 2), jadi Anda harus menulisnya sendiri:
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)
Sekarang Anda dapat menggunakan fungsi ini untuk mengurutkan daftar:
dirlist = sorted_alphanumeric(os.listdir(...))
MASALAH:
Jika Anda menggunakan fungsi di atas untuk mengurutkan string (misalnya nama folder) dan ingin mereka diurutkan seperti yang dilakukan Windows Explorer, ini tidak akan berfungsi dengan baik dalam beberapa kasus edge.
Fungsi pengurutan ini akan mengembalikan hasil yang salah pada Windows, jika Anda memiliki nama folder dengan karakter 'khusus' tertentu di dalamnya. Misalnya fungsi ini akan mengurutkan 1, !1, !a, a
, sedangkan Windows Explorer akan mengurutkan !1, 1, !a, a
.
Jadi jika Anda ingin mengurutkan persis seperti yang dilakukan Windows Explorer dengan Python, Anda harus menggunakan fungsi bawaan Windows bawaan StrCmpLogicalW melalui ctypes (ini tentu saja tidak akan berfungsi pada 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))
Fungsi ini sedikit lebih lambat dari sorted_alphanumeric()
.
Bonus: winsort
juga dapat mengurutkan jalur lengkap di Windows .
Alternatifnya, terutama jika Anda menggunakan Unix, Anda dapat menggunakan natsort
library ( pip install natsort
) untuk mengurutkan menurut jalur lengkap dengan cara yang benar (artinya subfolder di posisi yang benar).
Anda dapat menggunakannya seperti ini untuk mengurutkan jalur lengkap:
from natsort import natsorted, ns
dirlist = natsorted(dirlist, alg=ns.PATH | ns.IGNORECASE)
Jangan menggunakannya untuk pengurutan normal hanya nama folder (atau string secara umum), karena ini sedikit lebih lambat dari sorted_alphanumeric()
fungsi di atas.
natsorted
perpustakaan akan memberi Anda hasil yang salah jika Anda mengharapkan pengurutan Windows Explorer, jadi gunakan winsort()
untuk itu.