2009-03-13 18 views
53

अनुभव से, ऐसा लगता है कि अजगर के डिफ़ॉल्ट सूची सॉर्टर, जब tuples की एक सूची पारित कर दिया, प्रत्येक टपल में पहला तत्व के आधार पर सॉर्ट होगा। क्या वो सही है? यदि नहीं, तो अपने पहले तत्वों द्वारा tuples की सूची को सॉर्ट करने का सही तरीका क्या है?पायथन टुपल्स की सूची कैसे क्रमबद्ध करता है?

+5

से सॉर्ट करने के आप वास्तव में उदाहरण कोड चलाई? यदि हां, तो आपने क्या देखा? कृपया अपना नमूना कोड पोस्ट करें। –

उत्तर

67

यह स्वचालित रूप से ट्यूपल्स के पहले तत्वों द्वारा टुपल्स की एक सूची टाइप करता है, फिर दूसरे तत्वों द्वारा और टुपल ([1,2,3]) पर टुपल ([1,2,4]) से पहले जाएगा । यदि आप इस व्यवहार को ओवरराइड करना चाहते हैं तो सॉर्ट विधि के दूसरे तर्क के रूप में कॉल करने योग्य को पास करें। यह प्रतिदेय 1, -1 लौटना चाहिए, 0.

+15

सीएमपी तर्क का प्रयोग न करें अगर सॉर्ट करने के लिए कुंजी तर्क हालांकि करेगा! यही कारण है कि foo.sort पसंद करते है (कुंजी = लैम्ब्डा एक्स: एक्स [1]) foo.sort को (लैम्ब्डा एक्स, वाई: सीएमपी (एक्स [1], वाई [1]))। यह समझना और अधिक कुशल दोनों आसान है। – cthulahoops

+9

@cthulahoops मुझे लगता है कि 'operator.itemgetter' का उपयोग उस मामले में लैम्ब्डा फ़ंक्शन से बेहतर है:' foo.sort (key = operator.itemgetter (1)) 'foo.sort (key = lambda x: x 'से बेहतर है [1]) '। हालांकि यह सिर्फ मेरी राय है। –

+0

हालांकि प्रलेखन के लिए प्रासंगिक लिंक होना अच्छा लगेगा। – gaazkam

8

हाँ, यह डिफ़ॉल्ट है। वास्तव में, यह पाइथन में क्लासिक "डीएसयू" (सजावट-क्रमबद्ध-अपरिवर्तनीय) मुहावरे का आधार है। Code Like a Pythonista देखें।

5

नहीं है, tuples सिर्फ तार की तरह sequence types हैं। वे एक ही हल कर रहे हैं बदले में प्रत्येक तत्व की तुलना द्वारा:

>>> import random 
>>> sorted([(0,0,0,int(random.getrandbits(4))) for x in xrange(10)]) 
[(0, 0, 0, 0), (0, 0, 0, 4), (0, 0, 0, 5), (0, 0, 0, 7), (0, 0, 0, 8), 
(0, 0, 0, 9), (0, 0, 0, 12), (0, 0, 0, 12), (0, 0, 0, 12), (0, 0, 0, 14)] 

तीन शून्य है कि कुछ पहले तत्व के अलावा अन्य का निरीक्षण किया जा रहा है किया जाना चाहिए दिखाने के लिए केवल देखते हैं।

+0

एचएम। मैं अल्पमत में जा ... मैं अपने परीक्षण के परिणाम समझ में नहीं आता, यदि अजगर प्रकार केवल एक टपल में पहला तत्व को देखकर लग रहे हैं। – unwind

+0

यह पहली वस्तु के साथ शुरू होता है, लेकिन फिर चलता है। वासील का जवाब देखें। –

0

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

# l is the list of tuples 
l.sort(lambda x,y: x-y) 

आप तुलना समारोह, जरूरी नहीं कि एक लैम्ब्डा के लिए किसी भी प्रतिदेय उपयोग कर सकते हैं। हालांकि इसे -1 (कम से कम), 0 (बराबर) या 1 (से अधिक) लौटने की आवश्यकता है।

+0

-1: यह टुपल्स की सूची के साथ कैसे काम करेगा? मुझे TypeError मिलता है: असमर्थित ऑपरेंड प्रकार (-) के लिए -: 'tuple' और 'tuple' –

+0

लैम्बडा फ़ंक्शन जिसे क्रम में निष्पादित किया जाएगा, में एक तर्क होना चाहिए, जो एक tupla सेरी का iteratables तत्व है: pair.sort (कुंजी = लैम्ब्डा जोड़ी: जोड़ी [1])। pair.sort (key = lambda जोड़ी: जोड़ी [1]) या pair.sort (key = lambda जोड़ी: जोड़ी [1], जोड़ी [0]) यदि आप पहले तत्व द्वारा ऑर्डर करने के बाद ऑर्डर की दूसरी परत चाहते हैं । – Alex

0

चेक आउट "डेविन Jeanpierre" इस सवाल का sort-a-dictionary-in-python-by-the-value जहां वह एक टपल उपयोग करने के लिए कहते हैं और पता चलता है का जवाब कैसे दूसरा मान

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