Могу ли я получить предмет из PriorityQueue, не удаляя его?

Я хочу получить следующий элемент в очереди, но не хочу снимать его с очереди. Возможно ли это в очереди приоритетов Python? ИздокументыЯ не вижу как это можно сделать

Ответы на вопрос(3)

Решение Вопроса

он будет удален из очереди. Вы должны написать свою собственную функцию, которая даст вам последний элемент PriorityQueue. Вы можете создать функцию просмотра, наследуя приоритетную очередь.

 Nilesh15 февр. 2012 г., 06:19
Если вы можете проверить кодhg.python.org/cpython/file/2.7/Lib/Queue.py затем они используют список для хранения данных. Таким образом, вы можете играть со списком, как вы хотите, которыйself.queue в примере. Также вы можете проверить_get метод PriorityQueue, так что если вы хотите изменить эту функцию, то также переопределите эту функцию.
 Jiew Meng15 февр. 2012 г., 06:06
Предположим, что я расширяю PriorityQueue, мне все еще нужно получить доступ к базовому хранилищу данных, чтобы реализовать верное право? Но как?
 Jiew Meng15 февр. 2012 г., 09:05
cpython - это то же самое, что и python?

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

for i in range(len(queue)):
    print queue.queue[i]

это ничего не выскакивает.

Если вы хотите это в порядке приоритета, используйте:

for i in range(len(queue)):
    temp = queue.get()
    queue.put(temp)
    print temp

Если вы используете кортеж вместо одной переменной, замените temp на:

((temp1,temp2))
 Atnas22 мая 2018 г., 16:49
Первая часть не содержит элементов в порядке вставки, но первый элемент будет иметь элемент с наименьшим значением.
 MikeyE22 мар. 2017 г., 03:48
Это решение не ограничивается только объектами PriorityQueue. Это также работает для объектов очереди. Кажется, самое элегантное решение для меня. Без обид, но я не вижу, как другие ответы приближаются к этому (imho).

вы можете использовать a.queue [0] для получения следующего элемента:

from Queue import PriorityQueue

a = PriorityQueue()

a.put((10, "a"))
a.put((4, "b"))
a.put((3,"c"))

print a.queue
print a.get()
print a.queue
print a.get()
print a.queue

вывод:

[(3, 'c'), (10, 'a'), (4, 'b')]
(3, 'c')
[(4, 'b'), (10, 'a')]
(4, 'b')
[(10, 'a')]

но будьте осторожны с многопоточным доступом.

 Marawan Okasha10 окт. 2017 г., 16:51
@Woofas вы найдете, что 2-й самый высокий приоритет либоq.queue[1] или жеq.queue[2], Это потому, что в соответствии с теорией приоритетных очередей, родитель (q.queue[0] в этом случае) должен иметь более высокий приоритет, чем любой из двух его детей (q.queue[1] а такжеq.queue[2]), но конкретный порядок этих двух детей не важен. Это означает, что весь q.queue не абсолютно отсортирован, а отсортирован только «куча» (то есть каждый уровень имеет более высокий приоритет, чем уровень ниже него)
 Woofas27 янв. 2017 г., 03:26
Похоже, что в то время какq.queue[0] возвращает элемент с наивысшим приоритетом в очереди,q.queue[1] не обязательно возвращает 2-й элемент с наивысшим приоритетом
 g-abello27 февр. 2017 г., 16:57
@ Woofas То, что вы говорите, полностью верно, и с моей точки зрения, это неожиданное поведение ... Знаете ли вы, почему это происходит?
 Sush17 мая 2016 г., 08:00
В случае многопоточности мы можем заблокировать q.mutex и снять блокировку после чтения q.queue [0].
 Zitrax29 апр. 2014 г., 22:56
И обратите внимание, что get () блокирует по умолчанию, что индексация не будет делать.

Ваш ответ на вопрос