2010-10-24 15 views
40

मैं कक्षा उदाहरणों की एक सूची है। मैं इस पैरामीटर के आधार पर वस्तुओं को आरोही क्रम में कैसे क्रमबद्ध कर सकता हूं?क्रमबद्ध कक्षा की कई घटनाओं के अजगर

EDIT: list पायथन में sort कहा जाता है। क्या मैं इसका इस्तेमाल यहां कर सकता हूं? मैं इस फ़ंक्शन को अपने score विशेषता का उपयोग करने के लिए कैसे निर्देशित करूं?

उत्तर

64
import operator 
sorted_x = sorted(x, key=operator.attrgetter('score')) 

आप इन-जगह x क्रमबद्ध करना चाहते हैं, तो आप भी कर सकते हैं:

x.sort(key=operator.attrgetter('score')) 
+1

वाह! क्या यह इतना आसान है !! बस चेक किया गया। यह है :) –

+7

पायथन में आपका स्वागत है! पूर्णता के लिए: srot कार्यों/विधियों के लिए "कुंजी" पैरामीटर एक फ़ंक्शन को इसके पैरामीटर के रूप में स्वीकार करता है। ऑपरेटर मॉड्यूल उन कार्यों के लिए उपयोगी कार्यों को प्रदान करता है जो आम तौर पर भाषा सिंटेक्स द्वारा किए जाते हैं - जैसे कि "एड" फ़ंक्शन को भाषा में "+" टोकन करने के लिए, और इस मामले में अटैजटर को ऐसा करने के लिए " "कनेक्टर वाक्यविन्यास में करता है। "कुंजी" के अन्य पैरामीटर "लैम्ब्डा" के साथ परिभाषित इनस्थल फ़ंक्शन हो सकते हैं। इस मामले में, sorted_x = क्रमबद्ध (एक्स, लैम्ब्डा x: x.score)) - भी काम करता। दिया गया उदाहरण बेहतर है, यद्यपि। – jsbueno

+1

मुझे यकीन नहीं है कि 'attrgetter' का उपयोग करना बेहतर है। लगता है कि लैम्ब्डा बस इतना तेज़ लगता है, और क्लीनर आईएमओ देखो। – adw

88

समाधान आप स्वीकार किए जाते हैं के अलावा, आप भी विशेष __lt__() ("कम से कम") विधि को लागू कर सकता है कक्षा में sort() विधि (और sorted() फ़ंक्शन) तब वस्तुओं की तुलना करने में सक्षम होंगे, और इस प्रकार उन्हें सॉर्ट करें। यह सबसे अच्छा काम करता है जब आप उन्हें कभी भी इस विशेषता पर सॉर्ट करेंगे।

class Foo(object): 

    def __init__(self, score): 
     self.score = score 

    def __lt__(self, other): 
     return self.score < other.score 

l = [Foo(3), Foo(1), Foo(2)] 
l.sort() 
+1

यदि आपके पास सॉर्ट किए गए फ़ंक्शन तक पहुंच नहीं है तो यह विशेष रूप से उपयोगी है। यह तब होता है जब सॉर्ट किए गए कुछ अन्य मॉड्यूल जैसे मानक लाइब्रेरी मॉड्यूल द्वारा बुलाया जाता है। उदाहरण - आपके द्वारा आपूर्ति की जाने वाली वस्तुओं के लिए क्रमबद्ध 'कतार' कॉल में 'प्राथमिकता'। –

+1

क्या होगा यदि हमारे पास फू ['एबीसी', 3] –

+1

@ बिम्सशशर्मा जैसे 2 पैराम्स के साथ उदाहरण हैं, तो फिर अपने उदाहरणों की तुलना करने के तरीके के अनुसार अपनी '__lt__' विधि लिखें, उदा। 'वापसी (self.text, self.num) <(other.text, other.num)'। – kindall

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