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

Python's heapq, any iterative pop() methods?

这个问题可能对我目前正在处理的问题非常具体,我认为关注堆的具体情况会更容易和更清楚地解释。

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

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

毫不奇怪,它不起作用。我认为这是因为无法在修改堆的同时对其进行迭代。

我有什么方法可以窥视堆并检查它是否低于某个值(并且持续)?我也试过 heapq.nsmallest 但这个 returns 是一个我不需要任何目的的列表。

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

编辑:堆被初始化为一个列表。

编辑 2:

相关代码。基本上我有一堆根据结束时间排序的活动连接请求(它们 运行ning till 的时间)。 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 个。

我能想到的一种情况是,当有 2 个 active_requests 的结束时间小于新连接的开始时间时,我的代码将无法处理这种情况。

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

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: