2010-03-28 27 views
25

Tengo una lista de objetos que quiero convertir en un conjunto. Mis objetos contienen algunos campos, algunos de los cuales son o.id y o.area. Quiero que dos objetos sean iguales si estos dos campos son iguales. es decir: o1==o2 si y solo si o1.area==o2.area and o1.id==o2.id.Python: cómo funcionan los conjuntos

me trataron sobre-escritura __eq__ y __cmp__ pero me sale el error: TypeError: unhashable instance.

¿Qué debo sobreescribir?

+3

http://docs.python.org/library/stdtypes.html#set-types-set-frozenset y http://docs.python.org/glossary.html#term-hashable –

Respuesta

38

Defina el método __hash__ para devolver un hash significativo basado en los campos de id. Y área. Por ejemplo:

def __hash__(self): 
    return hash(self.id)^hash(self.area) 
+13

Soy un poco receloso de las operaciones bit a bit en algo así. Usaría algo como = return hash ((self.id, self.area)) =. –

+1

Es probable que esto sea un problema al mezclar dos componentes similares. Por ejemplo, hash (x)^hash (y) se comportará mal si las coordenadas par con los ejes intercambiados son comunes. En este caso, es muy poco probable que cause problemas, ya que es imposible generar ints y cadenas con hashes correlacionados. Una vez dicho esto, tu sugerencia sigue siendo buena, y ojalá hubiera pensado :-). –

9

"TypeError: instancia unhashable". de error se debe probablemente al estilo antiguo es decir definición de clase .:

class A: 
    pass 

Uso nuevo estilo en su lugar:

class A(object): 
    pass 

Si reemplaza __cmp__ función que debe __hash__ anulación para la utilización de su objeto en conjuntos. En el otro caso, hash considera que todas las instancias de objetos son desiguales y nunca se llamará a la función __cmp__.

Cuestiones relacionadas