如何对列表进行排序以保留具有最高优先级的项目? (蟒蛇)

时间:2017-11-30 04:15:45

标签: python list sorting queue

我正在尝试创建一个优先级队列,它接受包含出队或入队操作的输入,然后优先级后面的值可能如下所示:

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

如何更改排序,以便按最高优先级对项目进行排序,但保留具有相同优先级的项目的初始顺序?提前谢谢。

1 个答案:

答案 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']]