我正在使用heapq对象来存储我实现的类的对象。
import heapq
heap = []
element1 = Element('A', 1)
element2 = Element('B', 2)
element3 = Element('C', 3)
heapq.heappush(heap, element1)
heapq.heappush(heap, element2)
heapq.heappush(heap, element3)
在我的类Element中,我覆盖方法__cmp__
以确保值是优先级
def __cmp__(self, other):
return cmp(self.value, other.value)
现在我想写一个函数,它检查堆是否包含元素,这样
如果我想检查堆中是否element = Element('A', 1)
,答案将是True
,如果我将element = Element('A',100)
检查答案也是True
,但如果我想要要检查element = Element('D',1)
,答案将是False
。
我该如何实现这种方法?是否可以在不调用heapq
方法的情况下检查pop()
的元素?
答案 0 :(得分:4)
在__eq__
中添加方法Element
,以便您可以使用关键字in
检查会员资格(__eq__
代码不会Element('A', 1) == Element('A', 1)
False
}}):
class Element:
def __init__(self, key, value):
self.key = key
self.value = value
def __eq__(self, other):
return self.key == other.key
堆只是python中的列表,所以只需使用以下内容,__eq__
将完成剩下的工作:
Element('A', 1) in heap
import heapq
heap = []
element1 = Element('A', 1)
element2 = Element('B', 2)
element3 = Element('C', 3)
heapq.heappush(heap, element1)
heapq.heappush(heap, element2)
heapq.heappush(heap, element3)
print Element('A', 1) in heap # True
print Element('A', 100) in heap # True
print Element('D', 1) in heap # False
答案 1 :(得分:2)
solution by @enrico有效,实现__eq__
以检查元素是否在堆中,__cmp__
用于确定元素的优先级。但是,它会产生一些奇怪的副作用。例如,Element('A', 1)
与==
同时为<
和Element('A', 2)
。
或者,您可以使用常规tuples
而不是Element
包装类。首先使用数字,元组自然顺序就足够了,并且为了检查某个元素是否在堆中,您可以zip
项来获取实际键的列表(在您的示例中) :字母)。
heap = []
heapq.heappush(heap, (1, 'A'))
heapq.heappush(heap, (3, 'C'))
heapq.heappush(heap, (2, 'B'))
print 'A' in zip(*heap)[1]
print 'D' in zip(*heap)[1]
while heap:
print heapq.heappop(heap)
输出:
True
False
(1, 'A')
(2, 'B')
(3, 'C')