如何在不弹出Python heapq的情况下列出和更改元素?

如何在不弹出Python heapq的情况下列出和更改元素?,python,heap,Python,Heap,我有一个Python程序,它对一些任务进行排序,并在一定的延迟后执行它们 请检查下面的代码 import heapq import dateutil from dateutil.parser import * from datetime import * from time import sleep import time h = [] now = parse("Sat Oct 11 17:13:46 UTC 2003") today = now.date() tup1=(dateutil.pa

我有一个Python程序,它对一些任务进行排序,并在一定的延迟后执行它们

请检查下面的代码

import heapq
import dateutil
from dateutil.parser import *
from datetime import *
from time import sleep
import time
h = []
now = parse("Sat Oct 11 17:13:46 UTC 2003")
today = now.date()
tup1=(dateutil.parser.parse('13:00 5.5.2018'), 10, 3, 'Job 1')
# push items into queue:
heapq.heappush(h, tup1)
heapq.heappush(h, (dateutil.parser.parse('14:00 5.5.2018'), 10, 2, 'Job 2'))
heapq.heappush(h, (dateutil.parser.parse('14:00 5.5.2018'), 1, 10, 'Job 3'))
heapq.heappush(h, (dateutil.parser.parse('13:30 5.5.2018'), 1, 3, 'Job 4'))

try:
    while True:
        if h:
            tuple=(heapq.heappop(h))
            print(int(tuple[2]))
            time.sleep(int(tuple[2]))

except KeyboardInterrupt:
    print "exiting"

如何修改现有列表中的某些内容,例如,如果我想访问作业4的日期值,如何在不弹出它们的情况下将它们全部列出?

h
只是一个普通列表,如果您不关心顺序,您可以不使用
heapq
访问整个列表。但是,修改某些内容可能会破坏堆不变量。我试图修改它们,但收到消息“TypeError:‘tuple’对象不支持项分配”。我在谷歌上搜索了一下,看起来元组是不可变的。那么,它可以像上面的例子那样进行更改吗?您没有在上面修改它。您可能希望将
while True:
更改为简单的
while h:
,然后您可以删除
if
条件。顺便说一句:你不应该用python类型(
tuple
)来命名变量,因为你隐藏了类型函数。我知道我没有修改它,但我可以吗?我可以修改堆中已经存在的项吗。例如,我可以更改Job4的日期吗?当然,您可以更改列表中的任何项目,例如
h[2]=
,但您需要再次调用
heapify(h)
,将其重新放入堆中。如果它是最小的(例如Job4),则您可以
heappushpop(h,)