Je voudrais stocker un ensemble d'objets dans un tas min en définissant une fonction de comparaison personnalisée. Je vois qu'il y a un module heapq disponible dans le cadre de la distribution python. Est-il possible d'utiliser un comparateur personnalisé avec ce module? Sinon, quelqu'un d'autre a-t-il construit un tas min personnalisé?min tas en python
Répondre
Oui, il y a un moyen. Définissez une classe d'enveloppement qui implémente votre comparateur personnalisé et utilisez une liste de ceux-ci au lieu d'une liste de vos objets réels. C'est à peu près ce qu'il y a de mieux, tout en utilisant le module heapq, puisqu'il ne fournit aucun argument key = ou cmp = comme le font les fonctions/méthodes de tri.
def gen_wrapper(cmp):
class Wrapper(object):
def __init__(self, value): self.value = value
def __cmp__(self, obj): return cmp(self.value, obj.value)
return Wrapper
Notez que cela ne fonctionnera pas dans python 3.0, qui se débarrasse de __cmp__. –
Non, cela ne fonctionnera pas dans Python 3.0, mais cela n'a pas d'importance, car Python 3.0 n'a pas le concept entier de "fonction de comparateur". La question ne s'applique tout simplement pas dans ce cas. –
Um. Vous devriez définir __le__ plutôt que __cmp__. Cela garderait la compatibilité avec Python 2/3. Après tout, les opérations heapq et les opérations de tri utilisent <= comme fonction de comparaison. – tzot
Deux possibilités (à part la suggestion de Devin Jeanpierre):
vos données avant de Décore en utilisant le tas. C'est l'équivalent de l'option
key=
pour le tri. par exemple. si vous (pour une raison quelconque) voulait heapify une liste de numéros en fonction de leur sinus:data = [ # list of numbers ] heap = [(math.sin(x), x) for x in data] heapq.heapify(heap) # get the min element item = heappop(heap)[1]
Le module
heapq
est mis en œuvre en python pur. Vous pouvez simplement le copier dans votre répertoire de travail et modifier les bits pertinents. D'un coup d'oeil rapide, vous devrez modifier siftdown() et siftup(), et éventuellement nlargest et nsmallest si vous en avez besoin.
+1: Décorez vos données. –
En outre, le module heapq est implémenté à la fois en C et en Python. L'importation de heapq utilise le module C si disponible. – tzot
Ah, vous avez raison. Eh bien, la chose importante pour ma deuxième suggestion est que le code python est disponible dans votre répertoire lib si vous voulez rouler le vôtre. –
- 1. Python et le tas intégré
- 2. groupe SQL min/max en question
- 3. SQL Pivot MIN (COUNT (
- 4. Linq (MIN MAX &&)
- 5. absolu min date
- 6. constantPoolClass dans Java tas?
- 7. Marque javascript fichier min Version
- 8. MYSQL MAX et min QUERY
- 9. Problèmes d'invalidation de l'arbre min-max en place
- 10. débordement de pile en raison de l'allocation tas/désallocation
- 11. Comment puis-je indexer un tas de fichiers en Perl?
- 12. Fonctions d'agrégat SQL utilisant MIN et AVG
- 13. Sélection Tri - Index de Min/Max
- 14. Java tas d'espace dans netbeans .. mais j'ai déjà augmenté la taille du tas!
- 15. Recherche des heures max et min
- 16. VirtualEarth: déterminer min/max latitude visible/longitude
- 17. Un tas d'exceptions consignées dans Microsoft.VisualBasic.dll
- 18. Comment éviter la fragmentation de tas?
- 19. Gestion globale de la mémoire en C++ en pile ou en tas?
- 20. Résolution des problèmes de débordement de tas
- 21. Suivi taille du tas Eclipse-plugin * programatically *
- 22. Debug tas/STL débogage équivalent pour GCC?
- 23. Problèmes avec « Tas tampon » Erreur dans C
- 24. Quelle taille de tas préférez-vous?
- 25. Fibonacci, binaire ou tas binomial dans C#?
- 26. Taille de tas commise vs réservée.
- 27. VS2005: Limiter la taille du tas
- 28. Convertisseur Python 2.5 en Python 2.2
- 29. fusionner des listes triées en python
- 30. Dictionnaire en minuscules en Python
Pour un extrait plus confortable - (et Python 3 prêts), vérifier ma réponse à http://stackoverflow.com/questions/8875706/python-heapq-with-custom-compare-predicate/8875823#8875823 – jsbueno