2012-11-20 16 views
5

एक पायथन नौसिखिया का बिट, लेकिन मुझे tuples की निम्न सूची मिली है। मुझे tuples की एक सूची की आवश्यकता है जिससे tuples मूल्य से क्रमबद्ध हो और यदि मान समान है, वर्णानुक्रम में क्रमबद्ध।वर्णमाला के अनुसार tuples की सूची क्रमबद्ध करें और मूल्य

#original 
list_of_medals = [('Sweden', 24), ('Germany', 16), ('Russia', 10), ('Ireland', 10), ('Spain', 9), ('Albania', 8), ('Lithuania', 7), ('Iceland', 6), ('Malta', 5), ('Italy', 5), ('Serbia', 4), ('Estonia', 4), ('Turkey', 4), ('Moldova', 2), ('Azerbaijan', 2)] 
                   \____/                              \_____/           \______/ 
#after sorting            / \                             / \          / \ 
sorted_medals = [('Sweden', 24), ('Germany', 16), ('Ireland', 10), ('Russia', 10), ('Spain', 9), ('Albania', 8), ('Lithuania', 7), ('Iceland', 6), ('Malta', 5), ('Italy', 5), ('Estonia', 4), ('Serbia', 4), ('Turkey', 4), ('Azerbaijan', 2), ('Moldova', 2)] 

यह शायद import operator module` साथ संभव है: यहाँ एक नमूना है? सहायता की सराहना की जाएगी।

उत्तर

3

आप sorted फ़ंक्शन का उपयोग कर सकते हैं:

sorted_by_medals = sorted(list_of_medals, key=lambda tup: (-tup[1], tup[0])) 
+2

यह देश के नाम को अनदेखा करता है और इस प्रकार यह कल्पना को पूरा नहीं करता है। – NPE

+1

यह वैल्यू क्रमशः क्रमबद्ध नहीं है यदि मान समान हैं – bmu

+0

मिस्ड आवश्यकता: "यदि मान समान है, तो क्रमबद्ध रूप से क्रमबद्ध करें।" –

11

इस उदाहरण में, मैं sort()/sorted() को key तर्क के रूप में एक लैम्ब्डा समारोह का उपयोग करेंगे:

In [59]: sorted(list_of_medals, key=lambda x:(-x[1],x[0])) 
Out[59]: 
[('Sweden', 24), 
('Germany', 16), 
('Ireland', 10), 
('Russia', 10), 
('Spain', 9), 
('Albania', 8), 
('Lithuania', 7), 
('Iceland', 6), 
('Italy', 5), 
('Malta', 5), 
('Estonia', 4), 
('Serbia', 4), 
('Turkey', 4), 
('Azerbaijan', 2), 
('Moldova', 2)] 

x[1] का निषेध अवरोही क्रम देश के नाम छँटाई जबकि में पदक सॉर्ट करने के लिए की जरूरत है आरोही ऑर्डर (बस reverse=True को स्थापित नहीं करेगा)।

जैसा कि कई लोगों ने टिप्पणियों में बताया है, एक कंपाउंड कुंजी पर जटिल प्रकार करने का एक सामान्य तरीका कई सॉर्टिंग चरणों को करना है। एक समय में तरह एक घटक पर ऐसा करने के लिए, कम से कम महत्वपूर्ण एक के साथ शुरू:

In [67]: temp = sorted(list_of_medals, key=itemgetter(0)) 

In [68]: sorted(temp, key=itemgetter(1), reverse=True) 
Out[68]: 
[('Sweden', 24), 
('Germany', 16), 
('Ireland', 10), 
('Russia', 10), 
... 

इस तथ्य यह है कि अजगर की तरह स्थिर है, जिसका अर्थ है कि आइटम है कि बराबर की तुलना कभी नहीं पुनर्क्रमित कर रहे हैं पर निर्भर करता है।

+1

मुझे लगता है कि यह भी सच है कि अजगर की तरह "स्थिर" है उल्लेख के लायक है। जबकि आपको इस मामले में इसकी आवश्यकता नहीं है क्योंकि आप आसानी से '-x [1]' द्वारा छोटे-छोटे छोटे- आसानी से सॉर्ट कर सकते हैं, अन्य प्रकारों के साथ यह बहुत आसान नहीं है और आपको 2 में सॉर्टिंग करने के लिए मजबूर होना पड़ सकता है कदम। – mgilson

+0

आप दो बार भी सॉर्ट कर सकते हैं, क्योंकि पायथन सॉर्ट स्थिर है। – katrielalex

+1

@ katrielalex - महान दिमाग एक जैसे सोचना चाहिए। :) – mgilson