Python 如何正确使用堆对优先级队列进行定义和排序?

Python 如何正确使用堆对优先级队列进行定义和排序?,python,heap,priority-queue,Python,Heap,Priority Queue,我的作业是通过让用户以这种格式输入来创建priorityqueue 病例数 案例类型案例ID优先级 以1作为最高优先级 示例。 16 I 0 2 I 1 2 D I 3 I 4 1 D I 6 1 D I 8 1 D I 10 2 I 11 1 I 12 3 I 13 2 I 14 3 I 15 2 (我是指正常情况,D是指确定当时的最高优先级),然后按优先级打印剩余的caseID排序 这是我的密码 import heapq priority=[] num=int(input()) for i

我的作业是通过让用户以这种格式输入来创建priorityqueue
病例数
案例类型案例ID优先级
以1作为最高优先级

示例。
16
I 0 2
I 1 2
D
I 3
I 4 1
D
I 6 1
D
I 8 1
D
I 10 2
I 11 1
I 12 3
I 13 2
I 14 3
I 15 2

(我是指正常情况,D是指确定当时的最高优先级),然后按优先级打印剩余的caseID排序

这是我的密码

import heapq
priority=[]

num=int(input())
for i in range (0,num,1):
    temp=input()
    if (len(temp)>1):
        casetype,caseID,casePrio,=temp.split(" ",2)
        heapq.heappush(priority, (int(caseID),int(casePrio)))
    else:
        heapq.heappop(priority)

for i in range(len(priority)):
    print (priority[i][1]) 
我希望得到这个输出

输出:
11
1
10
13
15
3
12
十四,

但是换成这个

输出:
11
1
10
15
12
13
14
三,


优先级队列的整体思想是,当您弹出某个内容时,它会为您提供当前在队列中的最高优先级的项目。你不需要自己去分类。那只是做额外的工作

如果要按优先级顺序输出队列的其余部分,可以将最终循环替换为以下内容:

while (len(priority) > 0)
    print(heapq.heappop(priority));
每次调用
heappop
都将返回队列中优先级最高的项目

然而,不要指望得到你期望的结果<代码>heapq不保证具有同等优先级的项目的移除顺序。例如,如果要按此顺序插入项目:

10 1
11 2
12 2
13 3
然后删除它们,结果将是
10111213
。但如果将插入顺序更改为:

10 1
13 3
11 2
12 2

然后输出将是
1012113

堆没有排序-只有根元素有一个固定的位置,其他所有元素都尊重堆不变量(父元素小于任一子元素),但其他方面的顺序是任意的。这只是个人的注意,可能是因为我在这方面很糟糕,但我不认为你的物品是以一种容易理解的方式命名的。例如,我在您的说明中看到您有
案例编号
案例类型
caseID
优先级
。。。在你的代码中有
pio
numticz
x
y
。对于第一次阅读你的代码/作业的人来说,我必须反复思考,找出是为了什么。我没有遵循你的预期输出。也许可以添加一些关于跳过ID6和ID8的详细信息。在python中,deque也是一个双端队列。你用deque做动词,我不懂。你是说出列吗?@pylang 6和8被跳过,因为它们是用第3和第4个“D”命令从堆中删除的。是的,他应该用“出列”而不是“出列”。