2011-10-18 12 views
20

मैं python2.6 का उपयोग कर रहा हूं। क्या यह पाइथन के उच्च संस्करण में उपलब्ध है?
अन्यथा कोई अन्य तरीका है कि मैं गैर-तुच्छ कक्षाओं की वस्तुओं की सूची के लिए प्राथमिकता कतार बनाए रख सकता हूं? इसपायथन में, heapq.heapify cmp या key functions नहीं लेता है क्योंकि सॉर्ट किए गए तर्क जैसे

>>> l = [ ['a', 3], ['b', 1] ] 
>>> def foo(x, y): 
... return x[1]-y[1] 
>>> heap = heapify(l, cmp=foo) 

की तरह कुछ भी सुझाव मैं क्या जरूरत है?

+0

संभावित डुप्लिकेट [ हेपैक को एक विशिष्ट विशेषता के ढेर को कैसे मूल्यांकन किया जाए?] (Http://stackoverflow.com/questions/3954530/how-to-make-heapq-evaluate-the-heap-off-of-a- विशिष्ट- सामग्री) –

उत्तर

19

पारंपरिक समाधान ढेर पर (प्राथमिकता, कार्य) tuples स्टोर करने के लिए है:

pq = [ ] 
heappush(pq, (10, task1)) 
heappush(pq, (5, task2)) 
heappush(pq, (15, task3)) 
priority, task = heappop(pq) 

यह रूप में लंबे समय के रूप में कोई दो कार्यों की प्राथमिकता समान है ठीक काम करता है; अन्यथा, कार्यों की तुलना की जाती है (जो कि पाइथन 3 में बिल्कुल भी काम नहीं कर सकता है)।

नियमित डॉक्स कैसे heapq का उपयोग कर प्राथमिकता कतारों को लागू करने पर मार्गदर्शन दे:

http://docs.python.org/library/heapq.html#priority-queue-implementation-notes

+1

मुझे लगता है कि यह स्पष्ट है कि इस मामले में वह प्राथमिकताओं को मैन्युअल रूप से निर्दिष्ट करने के बजाय वस्तुओं से निकाला जाना चाहता है। – agf

+0

यह तब भी परेशानी का कारण बनता है जब कार्य 'np.array' है, जो तुलना में बूलियन का उत्पादन नहीं करता है – Eric

15

बस एक उपयुक्त __lt__ तो वे तरह सही ढंग से सूची में वस्तुओं के लिए विधि लिखें: हालांकि यह एक अच्छा विचार की तुलना या उपयोग की सभी को परिभाषित करने के लिए

class FirstList(list): 
    def __lt__(self, other): 
     return self[0] < other[0] 

lst = [ ['a', 3], ['b', 1] ] 

lst = [FirstList(item) for item in lst] 

केवल __lt__ छँटाई के लिए अजगर द्वारा की जरूरत है, functools.total_ordering

आप देख सकते हैं कि यह दो आइटमों का उपयोग करके पहले मूल्य और विभिन्न दूसरे मानों के साथ काम कर रहा है। जब आप heapify पर कोई फर्क नहीं पड़ता कि दो मान ऑब्जेक्ट्स स्वैप करेंगे क्योंकि lst[0] < lst[1] हमेशा False होगा। यदि आपको स्थिर होने के लिए heapify की आवश्यकता है, तो आपको अधिक जटिल तुलना की आवश्यकता है।

+4

पीईपी 8 सलाह देता है कि आप सभी छह तुलनाओं को परिभाषित करें और उपभोक्ता कार्यों के कार्यान्वयन विवरण पर भरोसा न करें। –

+3

@ रेमंडहेटिंगर मुझे पता है कि यह सामान्य सलाह है, इस मामले को छोड़कर यह ज्ञात है कि आवश्यक है - उपयोग का मामला मनमानी तुलना नहीं है बल्कि एक विशिष्ट उद्देश्य के लिए है। "सभी छह परिचालनों को लागू करना सबसे अच्छा है ताकि भ्रम अन्य संदर्भों में उत्पन्न न हो" यदि आप केवल एक संदर्भ में काम कर रहे हैं तो लागू नहीं होता है। – agf

+4

आसानी से सभी छह संचालनों का समर्थन करने के लिए '[email protected]_ordering'' जोड़ने के लिए तुच्छ है। एफडब्ल्यूआईडब्ल्यू, पीईपी 8 सलाह ढेर के साथ काम करने की सामग्री पर लागू होती है। \ _ \ _ Lt \ _ \ _() का उपयोग एक कार्यान्वयन विशिष्ट विवरण है जो परिवर्तन के अधीन है। बहुत पहले नहीं, इसे इसके बजाय \ _ \ _ le \ _ \ _() कहा जाता है। –

2

खैर, यह भयानक और भयानक है और आप निश्चित रूप से ऐसा नहीं करना चाहिए ... लेकिन यह heapq मॉड्यूल defines a cmp_lt function है, जो आप कर सकते थे बंदर पैच यदि आप वास्तव में एक कस्टम समारोह की तुलना करना चाहता था की तरह लग रहा है।

+1

यह भयानक क्यों है? इससे मेरा काम बनता है! मैं इस दृष्टिकोण का उपयोग कर अधिकतम ढेर को भी लागू कर सकता हूं। – Nullpoet

+2

यह भयानक और भयानक है क्योंकि, जब तक कि आप सावधान न हों, यह किसी भी अन्य कोड को तोड़ देगा जो 'हेपैक' मॉड्यूल का उपयोग करता है, और * भयंकर * किसी अन्य कोड को तोड़ देता है जो बंदर को 'हेपैक' मॉड्यूल पैच करने का प्रयास करता है। रेमंड हेटिंगर की सलाह का पालन करना बेहतर होगा, जो कि पाइथन के मॉड्यूल के लेखक हैं जो इस तरह एल्गोरिदम लागू करते हैं। –

1

अगर यह बेहतर है, लेकिन यह रेमंड Hettinger के समाधान की तरह है, लेकिन प्राथमिकता से निर्धारित किया जाता है मैं नहीं जानता वस्तु।

यह आपका ऑब्जेक्ट बनें और आप एक्स विशेषता द्वारा सॉर्ट करना चाहते हैं।

class Item:         
    def __init__(self, x): 
     self.x = x 

फिर जोड़ी

def create_pairs(items): 
    return map(lambda item: (item.x, item), items) 

लागू होता है तो फिर heapq.merge

list(heapq.merge(create_pairs([Item(1), Item(3)]), 
       create_pairs([Item(2), Item(5)]))) 

कौन मेरा पीछा उत्पादन दे दी है में इनपुट के रूप में सूची में समारोह लागू एक समारोह है

[(1, <__main__.Item instance at 0x2660cb0>), 
(2, <__main__.Item instance at 0x26c2830>), 
(3, <__main__.Item instance at 0x26c27e8>), 
(5, <__main__.Item instance at 0x26c2878>)] 
संबंधित मुद्दे