私はこのフォームで入力を処理プライオリティキューを作成しようとしています:優先度キューで同じ優先度のアイテムを処理するにはどうすればよいですか? (パイソン)
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
これをどのように修正できますか?リストの代わりにキューを使用してこれを解決する別の方法がありますか?ありがとう!
私はそれは本当にハードにあなたのコードに従うことを見つけることです。いずれにせよ、Pythonのソートは*安定*です。つまり、同じキーで要素を並べ替えないため、問題は別の場所にあります(複数のリストをマージする、またはソートキーが同じでないなど)。 – NPE
注目!コードを読みやすくするためにコードにコメントを追加しました。 :) – William