我正在尝试创建一个优先级队列,它接受包含出队或入队操作的输入,然后优先级后面的值可能如下所示:
enqueue 2 2
enqueue 1 3
enqueue 5 1
enqueue 6 2
dequeue
dequeue
dequeue
dequeue
我在开始时有这个代码,按优先顺序对此进行排序:
from queue import Queue
data=[]
while True:
operation = input()
if operation == "":
break
data.append(operation.split(" "))
data2=[]
data3=[]
for i in data: #separated into two list as not to get an out of range error when sorting
if "enqueue" in i:
data2.append(i)
else:
data3.append(i)
data2=sorted(data2,key=lambda x: int(x[2]))
data2=data2[::-1] #reversed to make it easier to order it by the highest priority
data=data2+data3 #put the enqueue and dequeue inputs together again
q=[]
for i in data:
if "enqueue" in i: #add to the queue by priority
q.append(i[1])
if "dequeue" in i: #dequeue by priority
print (q[0])
del q[0]
我现在的问题是,在具有相同优先级的情况下,它应遵循先进先出原则,但由于我对其进行了排序,因此初始订单丢失了。所以我会有一个列表:
所以我会有一个列表:
[['enqueue', '1', '3'], ['enqueue', '6', '2'], ['enqueue', '2', '2'], ['enqueue', '5', '1']]
它会输出:
1
6
2
5
而不是:
1
2
6
5
如何更改排序,以便按最高优先级对项目进行排序,但保留具有相同优先级的项目的初始顺序?提前谢谢。
答案 0 :(得分:2)
要解决您的问题,请在排序后反转data2
,将参数reverse = True
添加到sorted
来电。
这是因为python排序是稳定的,并且在排序时将保持原始顺序。如果您在>>排序后反转列表,它也会反转原始订单。
>>> data2 = sorted(data2, key = lambda x: int(x[2]), reverse = True)
>>> print(data2)
[['enqueue', '1', '3'], ['enqueue', '2', '2'], ['enqueue', '6', '2'], ['enqueue', '5', '1']]