2010-10-17 16 views
22

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

उत्तर

30

heapq प्रकार उसी तरह list.sort करता है, इसलिए सिर्फ अपने वर्ग परिभाषा के दायरे में एक विधि __cmp__() परिभाषित करते हैं, जो अपने आप में एक ही कक्षा का एक और उदाहरण के लिए की तुलना करेंगे वस्तुओं

3.x उपयोग में:

def __lt__(self, other): 
    return self.intAttribute < other.intAttribute 
+4

'__cmp__' 3.x में चला गया है। इसके बजाए '__lt__' का प्रयोग करें। –

+7

'__lt__' पायथन 2 में भी काम करता है, इसलिए यह बेहतर है कि '__cmp__' से पूरी तरह से बचें। –

+8

जैसा कि आप ऑब्जेक्ट के प्राकृतिक सॉर्टिंग (उदाहरण के लिए 'cmp' और' key' 'के लिए' key') के अलावा किसी मानदंड के आधार पर सॉर्ट करने के लिए किसी भी प्रकार को बता सकते हैं, तो आप 'हेपैक' को सॉर्ट करने के लिए कहने में सक्षम होना चाहिए अलग कुंजी दूसरे शब्दों में, आपको ऑब्जेक्ट को फिर से परिभाषित नहीं करना चाहिए * इसे रखने वाली एक विशेष डेटा संरचना को बदलने के लिए; आप केवल डेटा संरचना को ही बताने में सक्षम होना चाहिए। यह 'हेपैक' एपीआई से गायब एक उल्लेखनीय मौलिक टुकड़ा है। –

3

दुर्भाग्यवश, आप नहीं कर सकते, हालांकि यह अक्सर अनुरोधित सुविधा है।

एक विकल्प ढेर में (कुंजी, मूल्य) tuples डालने के लिए होगा। हालांकि, अगर कीमतों की तुलना में मान अपवाद फेंकते हैं तो यह काम नहीं करेगा (उनकी तुलना चाबियों के बीच टाई के मामले में की जाएगी)।

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

blist मॉड्यूल से sortedlist कक्षा का उपयोग करने का एक तीसरा विकल्प होगा (अस्वीकरण: मैं लेखक हूं)। sortedlist के लिए कन्स्ट्रक्टर key पैरामीटर लेता है जो आपको keylist.sort और sorted के पैरामीटर के समान किसी तत्व की सॉर्ट कुंजी वापस करने के लिए फ़ंक्शन निर्दिष्ट करने देता है।

अजगर 2. x में
def __cmp__(self, other): 
    return cmp(self.intAttribute, other.intAttribute) 

काम करता है:

+0

मैंने अपनी पिछली टिप्पणी हटा दी क्योंकि मेरी समस्या 'ब्लिस्ट' के साथ संभवतः एक पीईबीसीएक (फिर आपके मॉड्यूल के लिए धन्यवाद) थी, इसलिए मैं केवल पिछली टिप्पणी के पहले भाग को डुप्लिकेट करता हूं: '__lt__' के साथ कक्षा को परिभाषित करना हमेशा संभव है 'या तो subclassing या encapsulation के माध्यम से। – tzot

23

documentation से उदाहरण के अनुसार, आप tuples उपयोग कर सकते हैं, और यह टपल के पहले तत्व के आधार पर सॉर्ट देगा:

>>> h = [] 
>>> heappush(h, (5, 'write code')) 
>>> heappush(h, (7, 'release product')) 
>>> heappush(h, (1, 'write spec')) 
>>> heappush(h, (3, 'create tests')) 
>>> heappop(h) 
(1, 'write spec') 

तो यदि आप __cmp__ विधि नहीं करना चाहते हैं (या नहीं कर सकते हैं), तो आप पुश टाइम पर मैन्युअल रूप से अपनी सॉर्टिंग कुंजी निकाल सकते हैं।

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