2010-07-22 6 views
0

Je voudrais créer une file d'attente prioritaire en python dans laquelle la file d'attente contient différents dictionnaires avec leur numéro de priorité. Ainsi, quand une fonction "get" est appelée, le dictionnaire ayant la priorité la plus élevée (le plus petit numéro) sera retiré de la file d'attente et quand "add function" est appelée, le nouveau dictionnaire sera ajouté à la file d'attente numéro de priorité.Création d'une file d'attente de priorité python

Veuillez nous aider ...

Merci d'avance!

Répondre

6

Utilisez le module heapq dans la bibliothèque standard.

Vous ne précisez pas comment vous voulez associer des priorités avec des dictionnaires, mais voici une implémentation simple:

import heapq 

class MyPriQueue(object): 
    def __init__(self): 
     self.heap = [] 

    def add(self, d, pri): 
     heapq.heappush(self.heap, (pri, d)) 

    def get(self): 
     pri, d = heapq.heappop(self.heap) 
     return d 
+0

+1 pour la lib standard, et en utilisant heap, bien sûr. –

+0

Eh bien, j'espérais que ce pourrait être dans ce format: if __name__ == '__main__': parole = Speak() firstDict = { 'command_type': 'say_string', 'control_command': 'stop', 'priorité ': 3 } secondDict = {' type_commande ':' say_string ',' control_command ':' resume ',' priority ': 2 } thirdDict = {' type_commande ':' say_wav ',' control_command ': Aucun, 'priorité': 1 } #add les dictionnaires à la file d'attente globale dans le discours et les imprimer file d'attente de boucle #using speech.add_to_queue (firstDict) speech.add_to_queue (secondDict) speech.add_to_queue (thirdDict) speech.loop_queue() –

+0

pls hw est-ce que j'obtiens le format de code pour qu'il apparaisse mieux avec la bonne mise en forme. merci! –

0

Vous pouvez le faire en ajoutant un objet dict à la classe, et la recherche à l'intérieur.

2

C'est ce que je habituellement présente comme une note de côté dans certains de mes modèles parle:

class PriorityQueue(object): 
def __init__(self, key=lambda x: x): 
    self.l = [] 
    self.key = key 
def __len__(self): 
    return len(self.l) 
def push(self, obj): 
    heapq.heappush(self.l, (self.key(obj), obj)) 
def pop(self): 
    return heapq.heappop(self.l)[-1] 

Les exigences de l'OP sont apparemment d'utiliser operator.itemgetter('priority') comme argument key lors de l'instanciation PriorityQueue (a besoin d'un import operator en haut de module, bien sûr ;-).