어떤 이유로 든 파이썬에는 자연스러운 정렬 (1, 10, 2 대신 1, 2, 10을 의미 함) 을 갖는 기본 제공 방식이 없으므로 직접 작성해야합니다.
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)
이제이 함수를 사용하여 목록을 정렬 할 수 있습니다.
dirlist = sorted_alphanumeric(os.listdir(...))
문제 :
위의 기능을 사용하여 문자열 (예 : 폴더 이름)을 정렬하고 Windows 탐색기와 같이 정렬하려는 경우 일부 경우에 제대로 작동하지 않습니다.
이 정렬 기능은 특정 '특수'문자가 포함 된 폴더 이름이있는 경우 Windows에서 잘못된 결과를 반환합니다. 예를 들어이 함수는 sort 1, !1, !a, a
를 수행하지만 Windows 탐색기는 정렬합니다.!1, 1, !a, a
됩니다.
따라서 Python에서 Windows 탐색기와 똑같이 정렬하려면 ctypes를 통해 Windows 내장 함수 StrCmpLogicalW 를 사용해야합니다 (물론 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))
이 기능은 sorted_alphanumeric()
.
보너스 : Windows에서 전체 경로를 정렬winsort
할 수도 있습니다 . .
또는 특히 Unix를 사용하는 경우 natsort
라이브러리 ( pip install natsort
)를 사용하여 올바른 방법 (올바른 위치에있는 하위 폴더를 의미)으로 전체 경로를 기준으로 정렬 할 수 있습니다 .
다음과 같이 전체 경로를 정렬 할 수 있습니다.
from natsort import natsorted, ns
dirlist = natsorted(dirlist, alg=ns.PATH | ns.IGNORECASE)
sorted_alphanumeric()
위의 기능 보다 상당히 느리기 때문에 폴더 이름 (또는 일반적으로 문자열)의 일반적인 정렬에는 사용하지 마십시오 . Windows 탐색기 정렬을 예상
natsorted
하면 라이브러리가 잘못된 결과 를 제공 하므로이를 사용하십시오 winsort()
.