2014-10-18 2 views
4

Я только учусь приоритетные очереди в Python, и я сделал следующий код:Как отменить приоритетную очередь в Python без использования классов?

def main(): 
    q=Queue.PriorityQueue() 
    while True: 
     n=input("numbre?") 
     if n==0: 
      break 
     else: 
      q.put(n) 
      print n 

while not q.empty(): 
     print q.get() 

, когда входные данные, такие как: 9, 1, 4, 5

печатает 1,4, 5,9, что кажется правильным, но я хотел бы знать, как я могу это сделать в обратном порядке, я имею в виду: 9,5,4,1

Я знаю, как это сделать с классом, но в в этом случае представляется следующий дополнительный код:

def __cmp__(): 
     -cmp(q.get(),q.get()) 

не работает, любая помощь?

ответ

6

Общая схема состоит в том, чтобы вставлять данные в виде кортежа вместе с приоритетом. Таким образом, вы можете просто изменить put как это

q.put((-n ,n)) 

Таким образом, при сравнении кортежи, если цифры 9, 1, 4 и 5, они будут сравниваться как это (-9, 9), (-1, 1), (-4, 4) и (-5, 5). Поскольку, является наименьшим из всех, он будет извлечен первым, а затем -5, а затем -4, а затем -1.

Пример:

from Queue import PriorityQueue 
numbers, Q = [9, 1, 4, 5], PriorityQueue() 
for number in numbers: 
    Q.put((-number, number)) 

while not Q.empty(): 
    print Q.get() 

Выход

(-9, 9) 
(-5, 5) 
(-4, 4) 
(-1, 1) 

Чтобы получить только фактическое значение, просто напечатать только второй элемент, как это

while not Q.empty(): 
    print Q.get()[1] 
+0

благодаря @thefourtheye , но как сделать это для печати только 9,5,4,1 и не в форме кортежа? – Layla

+0

@Layla Нам просто нужно получить второй элемент, как я показал в обновленном примере – thefourtheye

Смежные вопросы