मुझे कई विशेषताओं के साथ एक अजगर सूची को सॉर्ट करना होगा मैं उन सभी गुणों के लिए आरोही क्रम में आसानी से कर सकता हूं
L.sort(key=operator.attrgetter(attribute))....
लेकिन समस्या यह है, कि मैं आरोही / अवरोही के लिए मिश्रित कॉन्फ़िगरेशन का उपयोग कर रहा हूं … मुझे एसक्यूएल आदेश को "अनुकरण" करना है, जहां आप "नाम एएससी, साल डीईएससी" की तरह कुछ कर सकते हैं। एक कस्टम तुलना समारोह को लागू किए बिना अजगर में आसानी से ऐसा करने का कोई तरीका है?
यदि आपकी विशेषताओं संख्यात्मक हैं, तो आपके पास यह है।
def mixed_order( a ): return ( a.attribute1, -a.attribute2 ) someList.sort( key=mixed_order )
यदि आपकी विशेषताओं में स्ट्रिंग्स या अन्य अधिक जटिल ऑब्जेक्ट्स शामिल हैं, तो आपके पास कुछ विकल्प हैं
.sort()
विधि स्थिर है: आप एकाधिक पास कर सकते हैं यह शायद सबसे सरल है यह भी उल्लेखनीय तेजी से है
def key1( a ): return a.attribute1 def key2( a ): return a.attribute2 someList.sort( key=key2, reverse=True ) someList.sort( key=key1 )
यदि यह एकमात्र क्रम है, तो आप अपने स्वयं के विशेष-उद्देश्य तुलना ऑपरेटरों को परिभाषित कर सकते हैं। न्यूनतम, आपको __eq__
और __lt__
आवश्यकता है। अन्य चार सरल तर्क द्वारा इन दो से प्राप्त किया जा सकता है।
एक कस्टम फ़ंक्शन आपका कोड अधिक पठनीय प्रस्तुत करेगा। यदि आपके पास कई सॉर्टिंग ऑपरेशन हैं और आप उन फ़ंक्शन को बनाना नहीं चाहते हैं, तो आप लैम्ब्डा का उपयोग कर सकते हैं:
L.sort(lambda x, y: cmp(x.name, y.name) or -cmp(x.year, y.year))
आप नहीं कर सकते हैं, लेकिन तुलना समारोह लेखन आसान है:
def my_cmp(a, b): return cmp(a.foo, b.foo) or cmp(b.bar, a.bar) L.sort(my_cmp)