Używam niestandardowych obiektów jako kluczy w słowniku Pythona. Obiekty te mają domyślnie zdefiniowane metody hash i eq, które są używane w domyślnym porównaniu Ale w niektórych funkcjach muszę użyć innego sposobu, aby porównać te obiekty. Czy istnieje sposób na zastąpienie lub przekazanie nowego porównywalnika dla tego porównania klucza tylko dla tej konkretnej funkcji.Klucze słownika języka Python (które są obiektami klasy) Porównanie z wieloma porównawczymi
Aktualizacja: Moja klasa ma następujące typu funkcjonalności (tu nie mogę edytować Hash sposób, będzie to miało wpływ na wiele innych miejsc)
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
Jest to normalna funkcjonalność. Ale w jednej konkretnej metody chcę zastąpić/lub przekazać nowe niestandardowe porównywarka gdzie nowy kod hash jest jak
def __hash__(self):
return self.name.lower().__hash__()
tak aby c in my_dict
powraca tury
lub my_dict[c] will return "obj1"
Niestety tak wiele aktualizacji.
Podobnie jak w przypadku sortowania, możemy przekazać niestandardową metodę porównywania, czy istnieje sposób, aby zrobić to samo tutaj.
Źle odczytałem pytanie (chodziło o sortowanie). Nadal możesz podać kod, aby zilustrować, co próbujesz osiągnąć? –
Potrzebuję jednej konkretnej metody porównywania tylko w jednej funkcji. I przez sortowanie, mam na myśli, że jak w sortowaniu możemy przekazać porównań, można to zrobić podczas sprawdzania kluczy – gsagrawal
Przy okazji, czy jesteś pewien, że chcesz '__eq__'-funkcja do porównywania skrótów? Hashe mogą mieć kolizje, więc w niektórych przypadkach może pojawić się nieoczekiwane zachowanie. –