2015-07-15 20 views
6

तुलना मैं एक 2 डी सूची जहां प्रत्येक "पंक्ति" आकार 2 की है क्रमित करना चाहते हैं, उदाहरण के लिए की तरहक्रमबद्ध किया गया समारोह का उपयोग कर समारोह

[[2,5],[2,3],[10,11]] 

ये पंक्तियां, वास्तव में पर्वतमाला प्रतिनिधित्व करते हैं तो इसका हमेशा [एक , बी] जहां < = बी

मैं इसे इस तरह से सॉर्ट करना चाहता हूं, सूची का प्रत्येक तत्व 2-सूची है, मेरे पास (प्राथमिकता के अनुसार) होगा: [ए 1, बी 1] की तुलना में [ए 2, बी 2]

1. If a1 < a2 do not permute 
2. If a1 > a2 permute 
3. If a1 == a2 then permute if (b1 - a1) > (b2 - a2) 

मुझे बेवकूफ लगता है कि पाइथन तुलनात्मक कार्यों के लिए अब और अनुमति नहीं देता है। इसके बजाय यह एक महत्वपूर्ण कार्य का उपयोग करता है। कोई तरीका नहीं है कि मैं इसके साथ एक वैध कुंजी बना सकता हूं क्योंकि मैं दो मानकों पर अपनी तुलना का आधार करता हूं, 'ए' का संख्यात्मक मूल्य (जो प्रचलित होता है) और फिर सीमा (बी - ए) की लंबाई।

मैं इसे कैसे हल कर सकता हूं? मेरा मतलब है, दो बार सॉर्ट किए बिना() या कुछ, जो मेरी राय में सादा बदसूरत है।

क्या यह भी संभव है? या क्या मैं कुछ नहीं देख रहा हूं?

धन्यवाद!

+0

लागू अजगर 3.3.3 पर छाँटे गए जब (तत्व, सीएमपी = समारोह) यह देता है मुझे " 'सीएमपी' इस समारोह के लिए कोई अमान्य कीवर्ड तर्क है" – Yannick

+0

बनाने के लिए है [डॉक्स] (https://docs.python.org/3/howto/sorting.html) 'key 'रूपांतरण फ़ंक्शन में' cmp' 'प्रदान करते हैं लेकिन यह सब सुंदर नहीं है। –

+1

आप आंतरिक सूची के लिए कक्षा भी बना सकते हैं और ['__cmp__'] ओवरराइड कर सकते हैं (https://docs.python.org/2/reference/datamodel.html#object.__cmp__) फ़ंक्शन –

उत्तर

5

हालांकि ऐसे मामले हैं जिन्हें key द्वारा नियंत्रित नहीं किया जा सकता है। यह उनमें से एक नहीं है। समाधान कुंजी समारोह वापसी एक tuple

>>> L = [[2, 5], [2, 3], [10, 11]] 
>>> sorted(L, key=lambda x:(x[0], x[1] - x[0])) 
[[2, 3], [2, 5], [10, 11]] 
+0

मैं उन मामलों के बारे में उत्सुक हूं जो नहीं कर सकते 'कुंजी' का उपयोग करके हल किया जाना चाहिए। क्या आपके पास कुछ उदाहरण है, कृपया? – Delgan

+0

बहुत धन्यवाद! मैं दूसरा @ डेलगन, यह जानना अच्छा होगा कि कौन से मामलों को हल नहीं किया जा सकता है (मुझे पता नहीं था कि टुपल्स एक कामकाजी समाधान था) – Yannick

+0

@ डेलगन, मान लीजिए कि उपन्यास सूची '[पहला नाम, उपनाम]' मुझे उपनाम द्वारा क्रमबद्ध करने की आवश्यकता है। जहां उपनाम बराबर हैं मुझे पहले नाम से क्रमबद्ध करने की आवश्यकता है - लेकिन विपरीत में। –

संबंधित मुद्दे