जो भी कारण प्राकृतिक तरीके से छंटाई करने का नहीं है (1, 2, 10 के बजाय 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 Explorer की तरह सॉर्ट किया जाए, तो यह कुछ एज मामलों में ठीक से काम नहीं करेगा।
यह सॉर्टिंग फ़ंक्शन विंडोज पर गलत परिणाम लौटाएगा, यदि आपके पास कुछ विशिष्ट 'वर्ण' वाले फ़ोल्डर नाम हैं। उदाहरण के लिए यह फ़ंक्शन सॉर्ट करेगा 1, !1, !a, a
, जबकि विंडोज एक्सप्लोरर सॉर्ट करेगा !1, 1, !a, a
।
इसलिए यदि आप ठीक उसी तरह से छांटना चाहते हैं जैसे कि पाइथन में विंडोज एक्सप्लोरर करता है तो आपको ctypes के माध्यम से विंडोज बिल्ट-इन फ़ंक्शन StrCmpLogicalW का उपयोग करना होगा (यह निश्चित रूप से यूनिक्स पर काम नहीं करेगा):
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()
।
बोनस: विंडोज पर पूर्ण पथwinsort
भी सॉर्ट कर सकते हैं ।
वैकल्पिक रूप से, विशेष रूप से यदि आप यूनिक्स का उपयोग करते हैं, तो आप natsort
लाइब्रेरी ( pip install natsort
) को सही तरीके से पूर्ण पथों द्वारा क्रमबद्ध करने का उपयोग कर सकते हैं (जिसका अर्थ है सही स्थिति में सबफ़ोल्डर)।
पूर्ण पथ को सॉर्ट करने के लिए आप इसका उपयोग कर सकते हैं:
from natsort import natsorted, ns
dirlist = natsorted(dirlist, alg=ns.PATH | ns.IGNORECASE)
इसे केवल फ़ोल्डर नामों (या सामान्य रूप से तार) के सामान्य सॉर्टिंग के लिए उपयोग न करें, क्योंकि यह sorted_alphanumeric()
ऊपर दिए गए फ़ंक्शन की तुलना में थोड़ा धीमा है । यदि आप Windows Explorer छँटाई की अपेक्षा करते हैं तो
natsorted
लाइब्रेरी आपको गलत परिणाम देगा , इसलिए इसके लिए उपयोग करें winsort()
।