Ordenar objetos de clase definida por el usuario en Python

El siguiente artículo explica cómo se pueden organizar los objetos de una clase definida por el usuario en función de cualquiera de las variables de la clase, que obviamente tendrá algún valor para cada objeto. Hasta ahora, somos conscientes de cómo podemos ordenar elementos de una lista, el concepto aquí es más o menos el mismo, excepto que es un paso adelante o podemos decir que es una versión avanzada de ordenar elementos pero en lugar de una lista estamos tratando con objetos de una clase. 

Aquí se utilizará el método  sorted() .

Sintaxis:

ordenado (iterable, clave (opcional), inversa (opcional))

Ejemplo: Este es solo un ejemplo genérico para mostrar cómo se emplea este método

Python3

print(sorted([1,26,3,9]))
  
print(sorted("Geeks foR gEEks".split(), key=str.lower))

Producción:

[1, 3, 9, 26]
['foR', 'Geeks', 'gEEks']

Clasificación de objetos de clase definida por el usuario

Método 1:

Para ordenar objetos de una clase definida por el usuario, se debe establecer una clave para el método ordenado, de modo que la clave sea un indicador de cómo se deben ordenar los objetos. Con referencia a los ejemplos que se dan a continuación, aquí se ha proporcionado una función a la clave que, uno por uno, compara el valor de la variable especificada para cada objeto y devuelve una lista ordenada de objetos para una clase.

Ejemplo 1: ordenar elementos en orden ascendente del valor entero que se les ha dado

Python3

class GFG:
    def __init__(self, a, b):
        self.a = a
        self.b = b
  
    def __repr__(self):
        return str((self.a, self.b))
  
  
# list of objects
gfg = [GFG("geeks", 1),
       GFG("computer", 3),
       GFG("for", 2),
       GFG("geeks", 4),
       GFG("science", 3)]
  
# sorting objects on the basis of value 
# stored at variable b
print(sorted(gfg, key=lambda x: x.b))

Producción:

[(‘geeks’, 1), (‘para’, 2), (‘computadora’, 3), (‘ciencia’, 3), (‘geeks’, 4)]

Ejemplo 2: ordenar objetos según el valor de string que contiene una variable

Python3

class GFG:
    def __init__(self, a, b):
        self.a = a
        self.b = b
  
    def __repr__(self):
        return str((self.a, self.b))
  
  
# list of objects
gfg = [GFG("geeks", 1),
       GFG("computer", 3),
       GFG("for", 2),
       GFG("geeks", 4),
       GFG("science", 3)]
  
# sorting objects on the basis of value 
# stored at variable a
print(sorted(gfg, key=lambda x: x.a.lower()))

Producción:

[(‘computadora’, 3), (‘para’, 2), (‘geeks’, 1), (‘geeks’, 4), (‘ciencia’, 3)]

Método 2:

Este método muestra cómo se pueden ordenar los objetos de una clase definida por el usuario utilizando el método incorporado de functools total_ordering como decorador de la clase. Aquí, la clase se define normalmente como se hizo en los ejemplos anteriores, la única diferencia es que durante la clasificación, se usa el decorador total_ordering(). Dos requisitos para usar total_ordering() son:

  • De menor que (__lt__), mayor que (__gt__), menor que igual a (__le__) y mayor que igual a (__ge__), al menos uno debe definirse en la clase que se está decorando con este método.
  • Debe definirse igual a (__eq__).

En el ejemplo que se muestra a continuación, menor que y mayor que, ambos se definen aunque durante el procesamiento solo se llama a uno (en este caso, menor que), ya que uno es suficiente para decidir el orden de los elementos, pero es una buena práctica de programación definir todo en caso de que una cosa falla. Durante la clasificación, se llama a uno de los métodos de comparación para comparar objetos en función de algún elemento y se devuelve el resultado ordenado.

Ejemplo:

Python3

import functools
from functools import total_ordering
  
  
@total_ordering
class GFG:
    print("inside class")
  
    def __init__(self, a, b):
        self.a = a
        self.b = b
  
    def __lt__(self, obj):
        return ((self.b) < (obj.b))
  
    def __gt__(self, obj):
        return ((self.b) > (obj.b))
  
    def __le__(self, obj):
        return ((self.b) <= (obj.b))
  
    def __ge__(self, obj):
        return ((self.b) >= (obj.b))
  
    def __eq__(self, obj):
        return (self.b == obj.b)
  
    def __repr__(self):
        return str((self.a, self.b))
  
  
# list of objects
gfg = [GFG("geeks", 1),
       GFG("computer", 3),
       GFG("for", 2),
       GFG("geeks", 4),
       GFG("science", 3)]
  
# before sorting
print(gfg)
  
# sorting objects on the basis of value 
# stored at variable b
# after sorting
print(sorted(gfg))

Producción:

dentro de la clase
[(‘geeks’, 1), (‘computadora’, 3), (‘para’, 2), (‘geeks’, 4), (‘ciencia’, 3)]
[(‘geeks’, 1 ), (‘para’, 2), (‘computadora’, 3), (‘ciencia’, 3), (‘geeks’, 4)]

Publicación traducida automáticamente

Artículo escrito por vanshikagoyal43 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *