Estoy utilizando objetos personalizados como claves en el diccionario de Python. Estos objetos tienen algunos hash predeterminados y eq métodos definidos que se usan en la comparación predeterminada Pero en alguna función necesito usar una forma diferente de comparar estos objetos. Entonces, ¿hay alguna manera de anular o pasar un nuevo comparador para esta comparación de clave solo para esta función específica?Python dictionary keys (que son objetos de clase) comparación con comparer múltiple
Actualizado: Mi clase presenta los siguientes tipo de funcionalidad (aquí no puedo editar de hash método, va a afectar mucho en otros lugares)
class test(object):
def __init__(self,name,city):
self.name=name
self.city=city
def __eq__(self,other):
hash_equality= (self.name==other.name)
if(not hash_equality):
#check with lower
return (self.name.lower()==other.name.lower())
def __hash__(self):
return self.name.__hash__()
my_dict={}
a=test("a","city1")
my_dict[a]="obj1"
b=test("a","city2")
print b in my_dict #prints true
c=test("A","city1")
print c in my_dict #prints false
print c in my_dict.keys() #prints true
# my_dict[c] throw error
Esta es la funcionalidad normal. Pero en un método específico que quiero para anular/o pasar a un nuevo comparador personalizada donde el nuevo código de hash es como
def __hash__(self):
return self.name.lower().__hash__()
de modo que los c in my_dict
vuelve Türe
o my_dict[c] will return "obj1"
Lo siento por lo que muchas actualizaciones
Al igual que en la clasificación, podemos pasar el método personalizado como comparador, ¿hay alguna manera de hacer lo mismo aquí.
He leído mal la pregunta (se trataba de ordenar). Aún así, ¿puede proporcionar algún código para ilustrar lo que está tratando de lograr? –
necesito un método de comparación específico en una sola función.Y ordenando la manera, quiero decir que como en sort podemos pasar el comparador, ¿puede hacerse al verificar las claves? – gsagrawal
Por cierto, ¿está seguro de que quiere su '__eq__'-function para comparar hashes? Los valores hash pueden tener colisiones, por lo que es posible que tenga un comportamiento inesperado en algunos casos. –