52 votes

En Python, heapq.heapify ne prend pas les fonctions cmp ou key comme arguments comme le fait trié

J'utilise python2.6. Est-il disponible dans la version supérieure de python ? Sinon, existe-t-il un autre moyen de maintenir des files d'attente prioritaires pour la liste d'objets de classes non triviales ? Ce dont j'ai besoin, c'est quelque chose comme ça

 >>> l = [ ['a', 3], ['b', 1] ]
>>> def foo(x, y):
...   return x[1]-y[1]
>>> heap = heapify(l, cmp=foo)

Aucune suggestion ?

4voto

David Wolever Points 34304

Eh bien, c'est terrible et horrible et vous ne devriez certainement pas le faire… Mais il semble que le module heapq définisse une fonction cmp_lt , que vous pourriez patcher si vous vouliez vraiment un fonction de comparaison personnalisée.

2voto

Cameron White Points 502

Je ne sais pas si c'est mieux mais c'est comme la solution de Raymond Hettinger mais la priorité est déterminée à partir de l'objet.

Que ce soit votre objet et que vous souhaitez trier par l'attribut x.

 class Item:                                 
    def __init__(self, x):
        self.x = x

Puis avoir une fonction qui applique l'appariement

 def create_pairs(items):
     return map(lambda item: (item.x, item), items)

Appliquez ensuite la fonction aux listes en entrée dans heapq.merge

 list(heapq.merge(create_pairs([Item(1), Item(3)]), 
                 create_pairs([Item(2), Item(5)])))

Ce qui m'a donné la sortie suivante

 [(1, <__main__.Item instance at 0x2660cb0>),
 (2, <__main__.Item instance at 0x26c2830>),
 (3, <__main__.Item instance at 0x26c27e8>),
 (5, <__main__.Item instance at 0x26c2878>)]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X