检查heapq是否包含值

时间:2014-08-14 20:04:44

标签: python queue priority-queue

我正在使用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()的元素?

2 个答案:

答案 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')