दिलचस्प पोस्ट
एक स्ट्रिंग में कई स्थानों को हटाने का आसान तरीका? HTML के रूप में एक टेम्पलेट वैरिएडर प्रदान करना तिथिपिप इंस्टीटिएट नहीं कर सकता java.net.SocketException: कनेक्शन रीसेट करें MySQL: रिवर्स संस्करण की तरह क्या है? क्या अप्रयुक्त आयात और वस्तुओं का प्रदर्शन प्रभाव पड़ता है एंड्रॉइड लॉलीपॉप, ऐप कॉमपेट एक्शनबार कस्टम व्यू पूरी स्क्रीन की चौड़ाई नहीं लेती कैसे रेंडर विधि के अंदर बाध्यकारी से बचें कैसे सी में structs की एक सरणी सॉर्ट करने के लिए? कैसे एक स्थिर समारोह का परीक्षण करने के लिए यूआरएल एक AJAX अनुरोध के लिए jQuery में एक स्ट्रिंग सांकेतिक शब्दों में बदलना ShouldAutorotateToInterfaceOrientation आईओएस 6 में नहीं बुलाया जा रहा है एक छवि के बगल में पाठ संरेखित करें? सी ++ फ़ोल्डर में जहां निष्पादन योग्य स्थित है पथ JsonArray को JsonObject में जोड़ें

दो मानदंडों द्वारा एक पायथन सूची को छंटनी

मेरे पास निम्न क्रमबद्ध सीएसवी से बनाई गई सूची है

list1 = sorted(csv1, key=operator.itemgetter(1)) 

मैं वास्तव में सूची को दो मापदंडों से क्रमबद्ध करना चाहूंगा: प्रथम फ़ील्ड 1 में मान से और उसके बाद फ़ील्ड में मान 2 से। मैं यह कैसे करूँ?

Solutions Collecting From Web of "दो मानदंडों द्वारा एक पायथन सूची को छंटनी"

इस तरह:

 import operator list1 = sorted(csv1, key=operator.itemgetter(1, 2)) 

संग्रह के लिए इस मृत धागा को उत्तर दें

लैम्ब्डा फ़ंक्शंस का उपयोग करते समय कोई भी आयात करने की आवश्यकता नहीं है
निम्न प्रकार की पहली list से list , फिर दूसरे तत्व द्वारा।

 sorted(list, key=lambda x: (x[0], -x[1])) 

पायथन का एक स्थिर प्रकार है, इसलिए प्रदान किया गया है कि प्रदर्शन कोई समस्या नहीं है, इसे सरलतम तरीके से क्षेत्र 2 के अनुसार क्रमबद्ध करना है और फिर फ़ील्ड 1 के द्वारा इसे फिर से सॉर्ट करना है।

यही आपको आपको वह परिणाम देगा जो आप चाहते हैं, केवल एक पकड़ यह है कि यदि यह एक बड़ी सूची है (या आप इसे अक्सर सॉर्ट करना चाहते हैं) तो दो बार सॉर्ट करना अस्वीकार्य ओवरहेड हो सकता है

 list1 = sorted(csv1, key=operator.itemgetter(2)) list1 = sorted(list1, key=operator.itemgetter(1)) 

इसे इस तरह से करना भी स्थिति को संभालना आसान बनाता है, जहां आप चाहते हैं कि कुछ कॉलम रिवर्स रिवर्स हो जाएं, जब आवश्यक हो तो 'रिवर्स = ट्रू' पैरामीटर भी शामिल करें।

अन्यथा आप आइटम पैराटर को एक से अधिक मापदंडों को पारित कर सकते हैं या मैन्युअल रूप से टुपल बना सकते हैं। शायद यह तेजी से हो रहा है, लेकिन समस्या यह है कि यदि कुछ कॉलम रिवर्स सॉर्ट करना चाहते हैं तो ये अच्छा नहीं सामान्यीकृत होता है (न्यूमेरिक कॉलम अभी भी उन्हें नकार करके उलट किया जा सकता है, लेकिन यह स्टाइल स्थिर हो जाता है)।

इसलिए यदि आपको किसी भी कॉलम की ज़रूरत नहीं है, तो सॉर्ट किया जाए, मदरेटर के लिए कई तर्कों के लिए जाएं, यदि आप हो, और कॉलम संख्यात्मक नहीं हैं या आप एक से अधिक लगातार प्रकार के लिए क्रमबद्ध स्थिर रखना चाहते हैं

संपादित करें: टिप्पणीकारों के लिए, जिनकी समस्या यह है कि यह मूल प्रश्न का उत्तर कैसे समझता है, यह एक उदाहरण है, जो दिखाता है कि सॉर्टिंग का स्थिर स्वभाव कैसे सुनिश्चित करता है कि हम प्रत्येक कुंजी पर अलग-अलग प्रकार के कर सकते हैं और कई मानदंडों पर क्रमबद्ध डेटा के साथ समाप्त कर सकते हैं:

 DATA = [ ('Jones', 'Jane', 58), ('Smith', 'Anne', 30), ('Jones', 'Fred', 30), ('Smith', 'John', 60), ('Smith', 'Fred', 30), ('Jones', 'Anne', 30), ('Smith', 'Jane', 58), ('Smith', 'Twin2', 3), ('Jones', 'John', 60), ('Smith', 'Twin1', 3), ('Jones', 'Twin1', 3), ('Jones', 'Twin2', 3) ] # Sort by Surname, Age DESCENDING, Firstname print("Initial data in random order") for d in DATA: print("{:10s} {:10s} {}".format(*d)) print(''' First we sort by first name, after this pass all Twin1 come before Twin2 and Anne comes before Fred''') DATA.sort(key=lambda row: row[1]) for d in DATA: print("{:10s} {:10s} {}".format(*d)) print(''' Second pass: sort by age in descending order. Note that after this pass rows are sorted by age but Twin1/Twin2 and Anne/Fred pairs are still in correct firstname order.''') DATA.sort(key=lambda row: row[2], reverse=True) for d in DATA: print("{:10s} {:10s} {}".format(*d)) print(''' Final pass sorts the Jones from the Smiths. Within each family members are sorted by age but equal age members are sorted by first name. ''') DATA.sort(key=lambda row: row[0]) for d in DATA: print("{:10s} {:10s} {}".format(*d)) 

यह एक रननीय उदाहरण है, लेकिन इसे चलाने वाले लोगों को बचाने के लिए यह है:

 Initial data in random order Jones Jane 58 Smith Anne 30 Jones Fred 30 Smith John 60 Smith Fred 30 Jones Anne 30 Smith Jane 58 Smith Twin2 3 Jones John 60 Smith Twin1 3 Jones Twin1 3 Jones Twin2 3 First we sort by first name, after this pass all Twin1 come before Twin2 and Anne comes before Fred Smith Anne 30 Jones Anne 30 Jones Fred 30 Smith Fred 30 Jones Jane 58 Smith Jane 58 Smith John 60 Jones John 60 Smith Twin1 3 Jones Twin1 3 Smith Twin2 3 Jones Twin2 3 Second pass: sort by age in descending order. Note that after this pass rows are sorted by age but Twin1/Twin2 and Anne/Fred pairs are still in correct firstname order. Smith John 60 Jones John 60 Jones Jane 58 Smith Jane 58 Smith Anne 30 Jones Anne 30 Jones Fred 30 Smith Fred 30 Smith Twin1 3 Jones Twin1 3 Smith Twin2 3 Jones Twin2 3 Final pass sorts the Jones from the Smiths. Within each family members are sorted by age but equal age members are sorted by first name. Jones John 60 Jones Jane 58 Jones Anne 30 Jones Fred 30 Jones Twin1 3 Jones Twin2 3 Smith John 60 Smith Jane 58 Smith Anne 30 Smith Fred 30 Smith Twin1 3 Smith Twin2 3 

विशेष रूप से ध्यान दें कि दूसरे चरण में reverse=True पैरामीटर, क्रम में प्रथम नाम रखता है, जबकि बस क्रमबद्ध करने के बाद सूची को पीछे छोड़कर तीसरा सॉर्ट कुंजी के लिए वांछित ऑर्डर खो जाएगा

 def keyfunc(x): return tuple(x[1],x[2]) list1 = sorted(csv1, key=keyfunc) 

मान लीजिए कि आप तारों की एक सरणी को सॉर्ट करना चाहते हैं जिसमें नंबर शामिल हैं, कहते हैं, से

 ["date_2015-1-1", "date_2015-1-10", "date_2015-1-2"] 

सेवा मेरे

 ["date_2015-1-1", "date_2015-1-2", "date_2015-1-10"] 

आप ऐसा कर सकते हैं:

 import re def sort_key(_str): return [ int(s) if s.isdigit() else s for s in re.split(r'(\d+)', _str) ] arr = ["date_2015-1-1", "date_2015-1-10", "date_2015-1-2"] sorted(arr, key=sort_key)