我正在尝试创建一个优先级队列,以这种形式处理输入:
enqueue 2 2
enqueue 1 3
enqueue 5 1
enqueue 6 2
dequeue
dequeue
dequeue
dequeue
我有使用列表的代码:
from queue import Queue
data=[]
while True:
try:
operation = input()
except:
break
data.append(operation.split(" "))
data2=[]
data3=[]
for i in data: #split enqueue and dequeue as not to get an out of range error
if "enqueue" in i:
data2.append(i)
else:
data3.append(i)
data2=sorted(data2,key=lambda x: int(x[2]))
data2=data2[::-1]
data=data2+data3 #merged the two again after sorting
q=[]
for i in data:
if "enqueue" in i: #add the item by the already sorted order of priority
q.append(i[1])
if "dequeue" in i: #print the first item dequeued before removing it from the queue
print (q[0])
del q[0]
我的问题在于输出:
1
6
2
5
而不是:(因为2在技术上排在6之前,并且在具有相同优先级的项目中,它们需要遵循队列的FIFO结构)
1
2
6
5
有没有人知道如何解决这个问题?是否有另一种方法可以使用队列而不是列表来解决这个问题?谢谢!
答案 0 :(得分:0)
如果您打印出数据2'在排序之前,排序之后,以及在data2 = data2 [:: - 1]之后,您将看到为什么会发生这种情况。
[['enqueue', '2', '2'], ['enqueue', '1', '3'], ['enqueue', '5', '1'], ['enqueue', '6', '2']]
[['enqueue', '5', '1'], ['enqueue', '2', '2'], ['enqueue', '6', '2'], ['enqueue', '1', '3']]
[['enqueue', '1', '3'], ['enqueue', '6', '2'], ['enqueue', '2', '2'], ['enqueue', '5', '1']]
在你翻转它之前,排序是正确的(即:具有相同键的元素按照它们输入的顺序排列),但是你想要的反转会给你翻转那些列表。
而不是:
data2=sorted(data2,key=lambda x: int(x[2]))
data2=data2[::-1]
尝试:
data2=sorted(data2,key=lambda x: int(x[2]), reverse=True)