这个问题可能对我目前正在进行的工作非常具体,我认为专注于堆的细节会更容易和更清楚地解释。
基本上,我正在尝试:
(我正在使用的实际堆返回一个元组,但我不认为它会影响任何东西,所以为了清晰起见)
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
的结束时间小于新连接的开始时间时,我的代码将无法处理此问题。
答案 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: