2009-10-04 14 views
15

मुझे एकाधिक विशेषताओं के साथ एक पायथन सूची क्रमबद्ध करना है। मुझे लगता है मैं आरोही के लिए मिश्रित विन्यास का उपयोग किया है कि सभीपायथन: एकाधिक गुणों और मिश्रित आदेश के साथ सूची छंटनी

L.sort(key=operator.attrgetter(attribute)).... 

के साथ आसानी से जिम्मेदार बताते हैं लेकिन समस्या यह है के लिए आरोही क्रम में ऐसा कर सकते हैं,/उतरते ... मैं करने के लिए "की नकल" एक सा एसक्यूएल आदेश जहां तक ​​है आप "एएससी नाम, वर्ष डीईएससी" जैसे कुछ कर सकते हैं। क्या कोई कस्टम तुलना फ़ंक्शन लागू किए बिना आसानी से पाइथन में ऐसा करने का कोई तरीका है?

+3

@ecatmur यह प्रश्न दूसरे की तुलना में पुराना है। डुप्लिकेट दूसरी तरफ है। – Jesse

उत्तर

26

: आप कई छँटाई आपरेशन है और आप हालांकि उन कार्यों बनाने के लिए नहीं करना चाहते हैं, तो आप लैम्ब्डा के उपयोग कर सकते हैं।

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__ की आवश्यकता है। अन्य चार सरल तर्क से इन दोनों से प्राप्त किए जा सकते हैं।

+0

धन्यवाद! कॉलिंट सॉर्ट() कई बार मेरे लिए सही समाधान साबित हुआ! –

+0

आपके उत्तर के लिए धन्यवाद! पहले भाग के बारे में थोड़ा उलझन; एक ट्यूपल लौटने से कम जटिलता वाले उच्च इंडेक्स मूल्यों के साथ एक जटिल प्रकार का प्रदर्शन होता है? मुझे लगता है कि मेरा प्रश्न अधिक आम तौर पर होता है, जब दो tuples सौंपते हैं तो 'cmp' व्यवहार कैसे करता है? मैंने चारों ओर देखा और यह दस्तावेज नहीं मिला। –

+0

__eq__ सरल तर्क का उपयोग करके __lt__ से लिया जा सकता है। :) – Tony

5

आप नहीं कर सकते हैं, लेकिन समारोह तुलना लेखन आसान है:

def my_cmp(a, b): 
    return cmp(a.foo, b.foo) or cmp(b.bar, a.bar) 
L.sort(my_cmp) 
7

एक कस्टम समारोह अपने कोड अधिक पठनीय प्रस्तुत करना होगा। अपनी विशेषताओं सांख्यिक हैं, तो आप इस राशि

L.sort(lambda x, y: cmp(x.name, y.name) or -cmp(x.year, y.year)) 
संबंधित मुद्दे