Tôi muốn lấy mục tiếp theo trong hàng đợi nhưng tôi không muốn xóa nó. Có thể nào trong Hàng đợi ưu tiên của Python không? Từ số docs, tôi không thấy làm thế nào nó có thể được thực hiệnTôi có thể nhận được một mặt hàng từ PriorityQueue mà không xóa nó?
Trả lời
Khi bạn nhận mục tạo thành hàng đợi theo lý thuyết, nó sẽ xóa khỏi hàng đợi. Bạn phải viết chức năng của riêng bạn mà sẽ cung cấp cho bạn phần tử cuối cùng của PriorityQueue. Bạn có thể tạo một chức năng nhìn trộm bằng cách thừa kế mức ưu tiên.
Lập chỉ mục phần tử đầu tiên của hàng đợi sẽ hoạt động. Nếu bạn đang sử dụng thư viện heapq
, tài liệu đề cập:
Thuộc tính thú vị của phần tử là phần tử nhỏ nhất của nó luôn là gốc,
heap[0]
.
Nếu a là một đối tượng PriorityQueue, Bạn có thể sử dụng a.queue [0] để có được những mục tiếp theo:
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
đầu ra là:
[(3, 'c'), (10, 'a'), (4, 'b')]
(3, 'c')
[(4, 'b'), (10, 'a')]
(4, 'b')
[(10, 'a')]
nhưng phải cẩn thận về truy cập chủ đề đa .
Và lưu ý rằng get() bị chặn theo mặc định, tính năng lập chỉ mục sẽ không thực hiện. – Zitrax
Trong trường hợp đa luồng, chúng tôi có thể khóa q.mutex và nhả khóa sau khi đọc q.queue [0]. – Sush
Có vẻ như trong khi 'q.queue [0]' trả về mục ưu tiên cao nhất trong hàng đợi, 'q.queue [1]' không nhất thiết trả về mục ưu tiên cao thứ 2 – Woofas
Nếu bạn muốn phần tử tiếp theo trong PriorityQueue, theo thứ tự chèn của các yếu tố, sử dụng:
for i in range(len(queue)):
print queue.queue[i]
này sẽ không bật bất cứ điều gì ra.
Nếu bạn muốn nó theo thứ tự ưu tiên, sử dụng:
for i in range(len(queue)):
temp = queue.get()
queue.put(temp)
print temp
Nếu bạn đang sử dụng một tuple, thay vì một biến duy nhất, thay thế tạm thời bởi:
((temp1,temp2))
Giải pháp này không chỉ giới hạn đối với các đối tượng PriorityQueue. Nó cũng hoạt động cho các đối tượng Queue. Có vẻ như là giải pháp thanh lịch nhất đối với tôi. Không có ý định phạm tội, nhưng tôi không thấy các câu trả lời khác đến gần như thế nào (imho). – MikeyE
Giả sử mục của bạn được lưu trữ trong PriorityQueue là một bộ (khóa, giá trị),
def peak(pq):
return pq.queue[0][1]
Giả sử tôi mở rộng PriorityQueue, tôi vẫn cần truy cập ing lưu trữ dữ liệu để thực hiện quyền cao nhất? Nhưng bằng cách nào? –
Nếu bạn có thể kiểm tra mã http://hg.python.org/cpython/file/2.7/Lib/Queue.py thì họ sử dụng danh sách để lưu trữ dữ liệu. Vì vậy, bạn có thể chơi với danh sách như bạn muốn đó là 'self.queue' trong ví dụ. Ngoài ra, bạn có thể kiểm tra phương thức '_get' của PriorityQueue vì vậy nếu bạn muốn thay đổi chức năng đó thì cũng ghi đè hàm đó. – Nilesh
là cpython giống như python? –