Python的heapq,任何迭代的pop()方法?

时间:2017-10-07 08:23:06

标签: python iteration heap

这个问题可能对我目前正在进行的工作非常具体,我认为专注于堆的细节会更容易和更清楚地解释。

基本上,我正在尝试:
(我正在使用的实际堆返回一个元组,但我不认为它会影响任何东西,所以为了清晰起见)

             while heap[0] < value:
                    heapq.heappop(heap)

毫不奇怪,它不起作用。我假设这是因为堆不能在修改它的同时进行迭代。

有没有办法让我偷看堆并检查它是否低于某个值(并且连续)?我也尝试了heapq.nsmallest,但这会返回一个我不需要用于任何目的的列表。

有什么想法吗?非常感谢。

编辑:堆初始化为列表。

EDIT2:

相关代码。基本上我有一堆活动连接请求,这些请求根据结束时间(它们运行多长时间)排序。 start变量是新连接的开始时间(以秒为单位),并且根据活动连接是否与此新连接重叠,可能会拒绝连接。

        # NetScheme
        if self.__net_scheme == ns.NetScheme.CIRCUIT:

            # Peek into the heap if heap non-empty
            if active_requests:
                #if active_requests[0][0] < start:
                #    req = heapq.heappop(active_requests)
                while active_requests[0][0] < start:
                    req = heapq.heappop(active_requests)
                    # Release circuit locks
                    for edge in req[1].getPath():
                        edge.isBusy = False
                        self.__graph.getCompEdge(edge).isBusy = False

理想情况下,这是我想要运行的,但是我遇到了错误,我怀疑这可能与我处理堆的方式无关。

while active_requests[0][0] < start:
IndexError: list index out of range

在第一个if语句下方评论的2行是我当前使用的,但是它将可能检查的连接数限制为仅为1.

我能想到的一个案例是当有两个active_requests的结束时间小于新连接的开始时间时,我的代码将无法处理此问题。

1 个答案:

答案 0 :(得分:1)

如果堆为空或在找到大于阈值的值之前变空,则循环不起作用。在索引堆以查看第一项之前,应检查该情况:

while heap and heap[0] < value:

现在,在您的实际代码中,您实际上有一个if来检查空堆,但是如果在运行循环时堆变为为空,则无效因为你弹出了最后一个值。)

尝试更改:

if active_requests:
    while active_requests[0][0] < start:

要:

while active_requests and active_requests[0][0] < start: