如何在优先级队列中处理具有相同优先级的项目? (Python)的

时间:2017-11-29 18:15:38

标签: python arrays list

我正在尝试创建一个优先级队列,以这种形式处理输入:

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

有没有人知道如何解决这个问题?是否有另一种方法可以使用队列而不是列表来解决这个问题?谢谢!

1 个答案:

答案 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)