दिलचस्प पोस्ट
कोडिनेटर के सक्रिय रिकॉर्ड पैटर्न के साथ यूनियन क्वेरी मैं PHP परियोजना में अप्रयुक्त फ़ंक्शन कैसे प्राप्त करूं? क्लाइंट-साइड जावास्क्रिप्ट में बेस 64 एन्कोडिंग और डीकोडिंग पायथन में पहले से परिभाषित होने के बाद एक वेरिएबल कैसे बदल सकता है पूर्णांक में अंकों की संख्या निर्धारित करने के लिए कुशल तरीका दस्तावेज़ फ़ोल्डर में फ़ाइलों की सूची प्राप्त करना टेक्स्टफील्ड पर टैप करने पर तिथिपिक्क प्रदर्शित करें क्या कोई निष्पादक सेवा जो वर्तमान धागा का उपयोग करता है? Emacs का प्रयोग करके पाठ फ़ाइलों में लगातार ढूंढ और प्रतिस्थापित करने के लिए पहले से ही खुले नहीं हैं Unixtime को Datetime SQL कन्वर्ट (ओरेकल) सुपर क्लास से उपवर्ग विधि को कॉल करना डेटा इनपुट के लिए कस्टम दृश्य का एक स्विफ्ट उदाहरण (कस्टम इन-एप कीबोर्ड) आर्किटेक्चर arm64 के लिए अनिर्धारित प्रतीकों base64 इनकोडेड छवियों ईमेल हस्ताक्षर में जावास्क्रिप्ट एक वस्तु में लगभग सब कुछ कैसे है?

अजगर में अल्फा न्यूमेरिक सेट को सॉर्ट करने के लिए कैसे करें

मेरे पास एक सेट है

set(['booklet', '4 sheets', '48 sheets', '12 sheets']) 

सॉर्ट करने के बाद मैं इसे देखना चाहता हूं

 4 sheets, 12 sheets, 48 sheets, booklet 

किसी भी विचार कृपया

वेब के समाधान से एकत्रित समाधान "अजगर में अल्फा न्यूमेरिक सेट को सॉर्ट करने के लिए कैसे करें"

छोटा एवं सुन्दर:

 sorted(data, key=lambda item: (int(item.partition(' ')[0]) if item[0].isdigit() else float('inf'), item)) 

यह संस्करण:

  • पायथन 2 और पायथन 3 में काम करता है, क्योंकि:
    • यह मान नहीं करता है कि आप तार और पूर्णांक की तुलना करते हैं (जो कि पायथन 3 में काम नहीं करेगा)
    • यह sorted करने के लिए cmp पैरामीटर का उपयोग नहीं करता है (जो पायथन 3 में मौजूद नहीं है)
  • स्ट्रिंग भाग पर सॉर्ट करे अगर मात्रा समान हो

यदि आप अपने उदाहरण में वर्णित रूप से मुद्रित आउटपुट चाहते हैं, तो:

 data = set(['booklet', '4 sheets', '48 sheets', '12 sheets']) r = sorted(data, key=lambda item: (int(item.partition(' ')[0]) if item[0].isdigit() else float('inf'), item)) print ',\n'.join(r) 

जेफ एटवुड प्राकृतिक प्रकार के बारे में बात करता है और पायथन में ऐसा करने का एक तरीका देता है। यहां पर मेरी विविधता है:

 import re def sorted_nicely( l ): """ Sort the given iterable in the way that humans expect.""" convert = lambda text: int(text) if text.isdigit() else text alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] return sorted(l, key = alphanum_key) 

इस तरह प्रयोग करें:

 s = set(['booklet', '4 sheets', '48 sheets', '12 sheets']) for x in sorted_nicely(s): print(x) 

आउटपुट:

 4 sheets 12 sheets 48 sheets booklet 

इस पद्धति का एक फायदा यह है कि यह सिर्फ काम नहीं करता जब स्ट्रिंग्स रिक्त स्थान से अलग हो जाते हैं। यह अन्य विभाजक जैसे कि संस्करण संख्या की अवधि (उदाहरण 1.9.1 1.10.0 से पहले आता है) के लिए भी काम करेगा।

एक आसान तरीका स्ट्रिंग को संख्यात्मक भागों और गैर-संख्यात्मक भागों में विभाजित करना और स्ट्रिंग्स को सॉर्ट करने के लिए अजगर ट्यूप्ले सॉर्ट क्रम का उपयोग करना है।

 import re tokenize = re.compile(r'(\d+)|(\D+)').findall def natural_sortkey(string): return tuple(int(num) if num else alpha for num, alpha in tokenize(string)) sorted(my_set, key=natural_sortkey) 

आपको तीसरी पार्टी लाइब्रेरी natsort की जांच करनी चाहिए। इसका एल्गोरिदम सामान्य है इसलिए यह अधिकांश इनपुट के लिए काम करेगा

 >>> import natsort >>> your_list = set(['booklet', '4 sheets', '48 sheets', '12 sheets']) >>> print ',\n'.join(natsort.natsorted(your_list)) 4 sheets, 12 sheets, 48 sheets, booklet 

यह सुझाव दिया गया था कि मैं इस उत्तर को यहां पर पुनर्पर्जित करता हूं क्योंकि यह इस केस के लिए अच्छी तरह से काम करता है

 from itertools import groupby def keyfunc(s): return [int(''.join(g)) if k else ''.join(g) for k, g in groupby(s, str.isdigit)] sorted(my_list, key=keyfunc) 

डेमो:

 >>> my_set = {'booklet', '4 sheets', '48 sheets', '12 sheets'} >>> sorted(my_set, key=keyfunc) ['4 sheets', '12 sheets', '48 sheets', 'booklet'] 

पायथन 3 के लिए इसे थोड़ा संशोधित करना आवश्यक है (यह संस्करण पायथन 2 में भी ठीक काम करता है)

 def keyfunc(s): return [int(''.join(g)) if k else ''.join(g) for k, g in groupby('\0'+s, str.isdigit)] 

सेट स्वाभाविक रूप से अन-आदेश दिए हैं। आपको उसी सामग्री के साथ एक सूची बनाना होगा और उसे ठीक करना होगा

 >>> a = set(['booklet', '4 sheets', '48 sheets', '12 sheets']) >>> def ke(s): i, sp, _ = s.partition(' ') if i.isnumeric(): return int(i) return float('inf') >>> sorted(a, key=ke) ['4 sheets', '12 sheets', '48 sheets', 'booklet'] 

साइलाइनटहोस्ट के जवाब पर आधारित:

 In [4]: a = set(['booklet', '4 sheets', '48 sheets', '12 sheets']) In [5]: def f(x): ...: num = x.split(None, 1)[0] ...: if num.isdigit(): ...: return int(num) ...: return x ...: In [6]: sorted(a, key=f) Out[6]: ['4 sheets', '12 sheets', '48 sheets', 'booklet'] 

लोगों के लिए पायथन के पूर्व-2.4 संस्करण के साथ फंस गए, बिना अद्भुत sorted() किए sorted() फ़ंक्शन, सॉर्ट करने का एक त्वरित तरीका है:

 l = list(yourSet) l.sort() 

यह ऊपर दिए गए विशिष्ट प्रश्न का उत्तर नहीं देता ( 12 sheets 4 sheets से पहले आयेगी), लेकिन यह Google से आने वाले लोगों के लिए उपयोगी हो सकता है।

तार की एक सरणी में किसी भी स्थिति में किसी भी संख्या को क्रमबद्ध करने के लिए सामान्य जवाब। पायथन 2 और 3 के साथ काम करता है

 def alphaNumOrder(string): """ Returns all numbers on 5 digits to let sort the string with numeric order. Ex: alphaNumOrder("a6b12.125") ==> "a00006b00012.00125" """ return ''.join([format(int(x), '05d') if x.isdigit() else x for x in re.split(r'(\d+)', string)]) 

नमूना:

 s = ['a10b20','a10b1','a3','b1b1','a06b03','a6b2','a6b2c10','a6b2c5'] s.sort(key=alphaNumOrder) s ===> ['a3', 'a6b2', 'a6b2c5', 'a6b2c10', 'a06b03', 'a10b1', 'a10b20', 'b1b1'] 

उत्तर का हिस्सा वहां से है