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:
这个问题可能对我目前正在处理的问题非常具体,我认为关注堆的具体情况会更容易和更清楚地解释。
基本上,我正在尝试:
(我正在使用 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: