2017-11-29 4 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

나는 그것이 정말 열심히 코드를 따라 찾는거야. 어쨌든 파이썬 정렬은 * 안정적입니다. 즉, 같은 키를 가진 요소의 순서를 바꾸지 않기 때문에 문제가 다른 곳에 있습니다 (아마도 여러 개의 목록을 병합하거나 정렬 키가 동일하지 않을 수도 있습니다). – 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는 true로 설정된 경우 'reverse'매개 변수를 갖습니다. –