2010-07-31 24 views

回答

0

不知道你確切的需求,但它可能是你會對我在DaniWeb關於優先級隊列的討論中發佈的代碼感興趣。該列表是容易通過切片等

#Python 2.6.5 
from random import randint 
class Priority: 
    def __init__(self,prioritylevels=5): 
     """The constructor builds list for priority queue which would be used later 
     """ 
     self.prioritylevels = prioritylevels 
     self.pq = [[] for priority in range(self.prioritylevels)] # prioritylevels 

    def add_to_queue(self, data, priority=None): 
     """Add every received in data and use priority parameter or 
     its priority key to get its priority value (1 == highest) in the global queue 
     """ 
     if priority is None: priority = data['priority']-1 
     else: priority -= 1 

     if 0 <= priority < self.prioritylevels: 
      self.pq[priority].append(data) 
     else: raise ValueError,"Priority level out of bounds: %s" % priority 

    def get(self): 
     """ get lowest priority values first from queue """ 
     for priorityevents in self.pq: 
      while priorityevents: 
       yield priorityevents.pop(0) ## use list as queue to keep insertion order (remove from front)    
    def num_items(self): 
     return sum(len(q) for q in self.pq) 


if __name__ == '__main__': 

    myqueue = Priority(8) 
    for i in range(100000): 
     item=randint(0,234234) 
     if not i % 10000: print i, 
     priority=(item & 0b111) +1 ## lets three lowest bits decide which priority we give 
     myqueue.add_to_queue(('Number',item),priority=priority) 

    print "\n%i items in queues" % myqueue.num_items() 
    print "Items by priorities" 
    print '\n'.join("%i: %i" % (priority+1,len(q)) for priority, q in enumerate(myqueue.pq)) 
    print "\nGetting items out of queue in priority order:" 
    priority=0 
    for description,i in myqueue.get(): 
     assert (i & 0b111 >= priority), '** Bug ***' ## validity test priority must be same or lower for items 
     priority = i & 0b111 
    # empty after get 
    print "Finished" 
    print "%i items in queue" % myqueue.num_items() 
10

在Python的queue module用於線程之間的同步共享數據保存拷貝。這是而不是打算作爲數據結構,它不支持複製(甚至不是淺拷貝)。

(有可能通過.get.put構建一個隊列的許多deepcopy的公司,但原有隊列將被銷燬。)

如果你想有一個隊列(或堆棧)的數據結構,use a collections.deque 。如果您想要優先隊列,請使用heapq module。該雙層支持deepcopy。 heapq由列表支持,因此deepcopy也受支持。