2012-02-15 7 views

Trả lời

1

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.

+0

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? –

+1

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

+0

là cpython giống như python? –

2

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].

23

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 .

+0

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

+0

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

+1

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

3

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

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

0

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]