Deseo contener un montón de objetos, no solo números. Tendrán un atributo de enteros en ellos que el montón puede ordenar por. La forma más fácil de usar montones en python es heapq, pero ¿cómo le digo que clasifique por un atributo específico cuando se usa heapq?¿Cómo hacer que heapq evalúe el montón de un atributo específico?
Respuesta
heapq
tipo de objetos de la misma manera list.sort
no, por lo que sólo definir un método __cmp__()
dentro de su definición de clase, lo que compararse con otra instancia de la misma clase:
def __cmp__(self, other):
return cmp(self.intAttribute, other.intAttribute)
Obras en Python 2.x
En uso 3.x:
def __lt__(self, other):
return self.intAttribute < other.intAttribute
Lamentablemente, no se puede, aunque esta es una función que a menudo se solicita.
Una opción sería insertar (clave, valor) tuplas en el montón. Sin embargo, eso no funcionará si los valores arrojan una excepción cuando se comparan (se compararán en el caso de un empate entre las claves).
Una segunda opción sería definir un método __lt__
(menor que) en la clase que usará el atributo apropiado para comparar los elementos para la clasificación. Sin embargo, eso podría no ser posible si los objetos fueron creados por otro paquete o si necesita que se comparen de manera diferente en otro lugar del programa.
Una tercera opción sería usar la clase sortedlist del módulo blist (descargo de responsabilidad: soy el autor). El constructor para sortedlist
toma un parámetro key
que le permite especificar una función para devolver la clave de clasificación de un elemento, similar al parámetro key
de list.sort
y sorted
.
Eliminé mi comentario anterior ya que mi problema con 'blist' era probablemente un PEBCAK (gracias de nuevo por su módulo), así que solo duplico la primera parte del comentario anterior: Siempre es posible definir una clase con' __lt__ 'a través de subclases o por encapsulación. – tzot
De acuerdo con el ejemplo de la documentation, puede utilizar tuplas, y se va a clasificar por el primer elemento de la tupla:
>>> h = []
>>> heappush(h, (5, 'write code'))
>>> heappush(h, (7, 'release product'))
>>> heappush(h, (1, 'write spec'))
>>> heappush(h, (3, 'create tests'))
>>> heappop(h)
(1, 'write spec')
Así Si no desea (¿o no puede hacerlo?) hacer un método __cmp__
, puede extraer manualmente su clave de clasificación en el momento del envío.
Tenga en cuenta que si los primeros elementos en un par de tuplas son iguales, se compararán otros elementos. Si esto no es lo que desea, debe asegurarse de que cada primer elemento sea único.
- 1. Cambie el valor de un atributo específico
- 2. ¿Cómo puedo hacer que el constructor de una estructura se evalúe secuencialmente en Common Lisp?
- 3. Hacer que NSInvocation invoque un IMP específico
- 4. Asignación de montón específico de subprocesos
- 5. css3 de atributo específico
- 6. Comprender cómo crear un montón en Python
- 7. ¿Cómo evitar que un objeto se cree en el montón?
- 8. ¿El montón es realmente un montón?
- 9. Encontrar elemento específico basado en un atributo
- 10. XPath: Seleccione el primer elemento con un atributo específico
- 11. DateTime.Parse y hacer que funcione con un formato específico
- 12. CSS o XPath selector de: elementos que tienen un atributo con el valor específico
- 13. Permitir un atributo personalizado solo en el tipo específico
- 14. ¿Cómo hacer un NSFetchRequest que solicita objetos que tienen un primer nombre específico?
- 15. ¿Puedo hacer que un atributo de Moose escriba "una vez"?
- 16. ¿Cuál es el más pequeño que puede hacer un montón de Java (Oracle JVM)?
- 17. Python: eliminar elemento del montón
- 18. jQuery analizando XML: obtener un elemento con un atributo específico
- 19. ¿Cómo hacer que SSH vaya directamente al directorio específico?
- 20. Cómo hacer referencia a un método en el parámetro atributo
- 21. ¿Es posible que una macro evalúe múltiples argumentos a otro?
- 22. hace que la condición después de && siempre se evalúe
- 23. cómo borrar el montón?
- 24. Magento - Recuperar productos con un valor de atributo específico
- 25. Rieles. Resumiendo un atributo específico de una colección
- 26. montón mínimo en python
- 27. Excluir atributo de un elemento XML específico utilizando xslt
- 28. Buscar todas las clases con un atributo que contiene un valor de propiedad específico
- 29. sobrecarga para un montón de montón vacío
- 30. Perl, evalúe la cadena perezosamente
'__cmp__' se ha ido en 3.x. Use '__lt__' en su lugar. –
'__lt__' también funciona en Python 2, por lo que es mejor evitar' __cmp__' por completo. –
Del mismo modo que puede ordenar cualquier clasificación según un criterio que no sea la ordenación natural del objeto (por ejemplo, 'cmp' y' key' para 'sort'), debería poder decirle a 'heapq' que ordene en función de un llave diferente En otras palabras, no debería tener que * redefinir el objeto en sí * para cambiar una estructura de datos particular que lo contiene; Debería poder decir la estructura de datos en sí misma. Esta es una pieza fundamental notable que falta en la API 'heapq'. –