2017-11-29 8 views
0

私はこのフォームで入力を処理プライオリティキューを作成しようとしています:優先度キューで同じ優先度のアイテムを処理するにはどうすればよいですか? (パイソン)

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

私はそれは本当にハードにあなたのコードに従うことを見つけることです。いずれにせよ、Pythonのソートは*安定*です。つまり、同じキーで要素を並べ替えないため、問題は別の場所にあります(複数のリストをマージする、またはソートキーが同じでないなど)。 – NPE

+0

注目!コードを読みやすくするためにコードにコメントを追加しました。 :) – William

答えて

0

ソート前、ソート後、およびdata2 = data2 [:: - 1]の後に 'data2'を印刷すると、これがなぜ発生しているのかがわかります。

[['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) 
+0

コードを完全に変更せずにこれを修正できる方法はありますか?なぜなら、逆転していない配列からインデックスを作成すると、デキューされた出力を得るためには、やはり逆方向に作業しなければならず、同じ問題が残ります。 – William

+0

私の更新された回答を参照してください。 sortedには、 'reverse'パラメータがあります。これは、trueに設定すると動作します –

関連する問題