2013-05-14 6 views
5

माना कि मेरे पास है:कैसे पहले मूल्य कम हो रही तो दूसरी मूल्य में वृद्धि हो रही में सॉर्ट करने के लिए

student_tuples = [ ('john', 'A', 15), 
        ('peter', 'B', 12), 
        ('dave', 'C', 12)] 

मैं इसे कैसे क्रमित करूं इस तरह होने के लिए:

student_tuples = [('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)] 

मैं क्या लगता है कि कर सकते हैं:

from operator import itemgetter 

sorted(student_tuples, key=itemgetter(2,0), reverse=True) 

लेकिन फिर उत्पादन होगा:

student_tuples = [('john', 'A', 15), ('peter', 'B', 12), ('dave', 'C', 12)] 

और यह वही नहीं है जो मैं चाहता हूं। मैं itemgetter या किसी अन्य आसान तरीके से इसका उपयोग कैसे कर सकता हूं?

+0

चेक इस [पोस्ट] (http://stackoverflow.com/questions/3121979/how-to-sort-list-tuple-of-lists-tuples)। मुझे लगता है कि आपको जो भी चाहिए वह सब कुछ है। – ibi0tux

+0

इसके लायक होने के लिए, मुझे विश्वास नहीं है कि यह एक डुप्लिकेट है। यह सवाल विशेष रूप से पूछ रहा है कि कैसे एक अवरोही कुंजी और एक आरोही कुंजी द्वारा सॉर्ट करना है, जबकि "डुप्लिकेट" केवल एकाधिक कुंजी के बारे में पूछ रहा है। – RichieHindle

+2

नहीं, यह बदले में [पाइथन: एकाधिक गुणों और मिश्रित आदेश के साथ सूची छंटनी] का एक डुप्लिकेट है (http://stackoverflow.com/q/1516249) –

उत्तर

9

यह यह करता है:

print sorted(student_tuples, key=lambda t: (-t[2], t[0])) 
# [('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)] 
+0

दो पास में छंटनी जाने का एक बेहतर तरीका है। अस्वीकृत कुंजी दृष्टिकोण केवल संख्यात्मक कुंजी के साथ काम करता है। –

5

अपनी खुद की कुंजी हो रही समारोह लिखें।

student_tuples = [ ('john', 'A', 15), ('peter', 'B', 12), ('dave', 'C', 12)] 

def student_key(args): 
    name, letter, number = args 
    return (-number, name) 

>>> sorted(student_tuples, key=student_key) 
[('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)] 
+0

निश्चित रूप से सबसे अधिक पढ़ने योग्य तरीका – jamylak

+0

@ स्कूलीबाय हां वे वही हैं, जब मैंने अपना खुद का पोस्ट किया तो केवल उनका देखा। अगर मैंने उसे देखा तो मैं इसे पोस्ट नहीं करता। क्या इन स्थितियों के बारे में नीति है? –

+0

@ स्कूलीबॉय नहीं, यह बिल्कुल वही नहीं है: एड्रियन के समाधान में, एक अनपॅकिंग है, जिसका अर्थ है पहचानकर्ताओं के नाम, पत्र, संख्या 'के लिए ऑब्जेक्ट्स के तीन असाइनमेंट, जो आवश्यक नहीं हैं, क्योंकि रिचीइंडल का समाधान दिखाता है। – eyquem

3

आप कहाँ संख्यात्मक फ़ील्ड आसानी से नकार दिया जा सकता है कि नहीं है, तो आप हमेशा एक दो चरण तरह कर सकते हैं, तथ्य यह है कि अजगर के .sort स्थिर है पर निर्भर:

student_tuples.sort(key=itemgetter(0)) 
student_tuples.sort(key=itemgetter(2), reverse=True) 
+0

+1 यह करने का इरादा तरीका है। –

2

तरह से घोंसला। सबसे महत्वपूर्ण/पहली प्राथमिकता क्रमबद्ध प्रकार में।

student_tuples = [ ('john', 'A', 15), 
        ('peter', 'B', 12), 
        ('dave', 'C', 12)] 

from operator import itemgetter 

sorted_ = sorted(sorted(student_tuples,key = itemgetter(0)), key=itemgetter(2), reverse=True) 

देता

>>> sorted_ 
[('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)] 
संबंधित मुद्दे