es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Método __eq__ para comparar dos objetos personalizados con listas.

Tengo una clase de Python que contiene una lista de cadenas. Quiero comparar dos instancias de esta clase. Sin embargo, noté que si mi clase es grande, la comparación se vuelve bastante difícil de escribir. ¿Hay una manera más fácil de escribir el método __eq__ que esto? Uso una Lista en lugar de un Conjunto porque quiero llenar esta clase con datos de JSON en una etapa posterior.

json_one = {"varone": "hello", "vartwo": ["foo", "bar"]}
json_two = {"varone": "hello", "vartwo": ["bar", "foo"]}
from dataclasses import dataclass
from typing import List

@dataclass
class Test:
    var_one: str
    var_two: List[str]

    def __eq__(self, other):
        if isinstance(other, Test):
            return self.var_one == other.var_one\
                   and sorted(self.var_two) == sorted(other.var_two)
        return False


test_one = Test(json_one)
test_two = Test(json_two)

if test_one == test_two:
    print("¡estamos iguales con listas en orden diferente!")
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera más fácil de escribir el método __eq__ para comparar dos instancias de esta clase que contiene una lista de cadenas. En lugar de comparar los valores de cada elemento de la lista individualmente, podemos ordenar las listas y compararlas directamente. De esta manera, solo se necesita una línea de código para comparar las listas. Aquí hay un ejemplo del método __eq__ modificado:

    def __eq__(self, other):
        if isinstance(other, Test):
            return self.var_one == other.var_one and sorted(self.var_two) == sorted(other.var_two)
        return False
    

    Con esta modificación, solo necesitamos ordenar la lista y compararlas directamente, lo que hace que el código sea más limpio y fácil de leer. Este enfoque funcionará para cualquier tamaño de la lista, grande o pequeña.

Comments are closed.