Me gustaría almacenar un conjunto de objetos en un montón mínimo mediante la definición de una función de comparación personalizada. Veo que hay un módulo heapq disponible como parte de la distribución de Python. ¿Hay alguna manera de usar un comparador personalizado con este módulo? Si no, ¿alguien más ha creado un montón de minutos personalizado?montón mínimo en python
Respuesta
Sí, hay una manera. Defina una clase de ajuste que implemente su comparador personalizado y use una lista de ellos en lugar de una lista de sus objetos reales. Eso es lo mejor que hay al usar el módulo heapq, ya que no proporciona ningún argumento key = o cmp = como lo hacen las funciones/métodos de clasificación.
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
Tenga en cuenta que esto no funcionará en Python 3.0, que se deshace de __cmp__. –
No, no funcionará en Python 3.0, pero eso no importa, porque Python 3.0 carece del concepto completo de "función de comparación". La pregunta simplemente no se aplica en ese caso. –
Um. Debe definir __le__ en lugar de __cmp__. Eso mantendría la compatibilidad con Python 2/3. Después de todo, las operaciones y las operaciones de clasificación de heapq usan <= como su función de comparación. – tzot
dos opciones (aparte de la sugerencia de Devin Jeanpierre):
Decora tus datos antes de utilizar el montón. Esto es el equivalente de la opción
key=
para clasificar. p.ej. si (por alguna razón) quería heapify una lista de números de acuerdo a su seno:data = [ # list of numbers ] heap = [(math.sin(x), x) for x in data] heapq.heapify(heap) # get the min element item = heappop(heap)[1]
El módulo
heapq
está implementado en Python puro. Podrías copiarlo a tu directorio de trabajo y cambiar los bits relevantes. Desde un vistazo rápido, tendría que modificar siftdown() y siftup(), y posiblemente nlargest y nsmallest si los necesita.
+1: Decora tus datos. –
Además, el módulo heapq se implementa tanto en C como en Python. La importación de heapq usa el módulo C si está disponible. – tzot
Ah, tienes razón. Bueno, lo importante para mi segunda sugerencia es que el código python está disponible en tu directorio lib si quieres hacer tu propio código. –
- 1. Tamaño de montón mínimo de manifiesto de Android VM
- 2. C++ montón mínimo con tipo definido por el usuario
- 3. Python, lambda, busque mínimo
- 4. manera fácil de mantener un montón mínimo con stl?
- 5. Python: eliminar elemento del montón
- 6. Comprender cómo crear un montón en Python
- 7. Encontrar el mínimo y máximo en python
- 8. python crea todo desde el montón?
- 9. ¿Hay alguna manera fácil de hacer un montón mínimo en C++?
- 10. .NET generation 0 montón
- 11. ¿Cómo implementar un servidor mínimo para AJAX en Python?
- 12. Código de correspondencia bipartita de peso máximo/mínimo en Python
- 13. ¿Hay un estilo mínimo para unittest en Python?
- 14. ¿Es una matriz ordenada un min-heap? ¿Cuál es el valor mínimo de un montón máximo?
- 15. clase montón en .NET
- 16. ¿El montón es realmente un montón?
- 17. sobrecarga para un montón de montón vacío
- 18. Biblioteca de corte mínimo de flujo máximo para Python
- 19. Implementación de C++ de un montón binario
- 20. Distribuir un programa de Python con un entorno mínimo
- 21. Eliminación en el montón binario
- 22. Objetos asignados en el montón
- 23. Error en un ejemplo mínimo de tkSimpleDialog
- 24. ¿Cuál es la relación entre "un" montón y "el" montón?
- 25. graph - ¿Cómo encontrar el ciclo dirigido mínimo (peso mínimo total)?
- 26. Cómo limitar el tamaño del montón?
- 27. Gestión de montón multiproceso
- 28. sonar findbugs montón tamaño
- 29. cómo borrar el montón?
- 30. Arrays multidimensionales en C++ en el montón
Para un fragmento más cómodo - (y Python 3 listo), comprobar mi respuesta a http://stackoverflow.com/questions/8875706/python-heapq-with-custom-compare-predicate/8875823#8875823 – jsbueno