我想出了以下代码,但不知何故,它无法正常工作。这可能是什么原因。想法是将一对计数和项目放入优先队列,然后弹出。但是如何在python3中实现呢?
import heapq
class Stack:
def __init__(self):
self.dict ={}
self.cnt = 0
self.hq = []
def push(self, item):
self.cnt += 1
self.heappush(hq, {self.cnt:item})
def pop(self):
self.cnt -= 1
return self.heappop(hq)
if __name__ == '__main__':
s = Stack()
s.push(10)
s.push(20)
s.push(30)
print(s.pop())
我收到以下错误。
Traceback (most recent call last):
File "/home/shrivatsa/Documents/E/Learning-Path/Python/Algorithms and Datastructure/stackpriorityqueue.py", line 19, in <module>
s.push(10)
File "/home/shrivatsa/Documents/E/Learning-Path/Python/Algorithms and Datastructure/stackpriorityqueue.py", line 11, in push
self.heappush(hq, {self.cnt:item})
AttributeError: 'Stack' object has no attribute 'heappush'
答案 0 :(得分:1)
self
关键字用于引用对象,通过这种方式,我们可以指定我们引用的是在类中定义的属性或方法。 heappush
和heappop
不是在Stack类中定义的,而是在heapq
库中定义的,因此应将它们分别命名为heapq.heappush
和heapq.heappop
。
要考虑的另一个问题是字典没有定义顺序,因此不能将它们推入堆中。如果要保存这些对,则应改用元组。
示例:
import heapq
class Stack:
def __init__(self):
self.cnt = 0
self.hq = []
def push(self, item):
self.cnt += 1
heapq.heappush(self.hq, (self.cnt, item))
def pop(self):
self.cnt -= 1
return heapq.heappop(self.hq)
if __name__ == '__main__':
s = Stack()
s.push(10)
s.push(20)
s.push(30)
print(s.pop())
答案 1 :(得分:0)
heappush
和heappop
是heapq
库中的函数。例如,当您编写self.heappush(...)
时,就是说“使用来自该实例的数据调用名为heappush
的此类中的函数)”。但是您的类Stack
没有名为heappush
的函数,因此会出错。
要从heapq
库中调用函数,请改用heapq.heappush(...)
和heapq.heappop(...)
。