2008-12-08 14 views
6

Prosty kod:Do czego służy zestaw funkcji, aby sprawdzić, czy dwa obiekty są różne?

>>> set([2,2,1,2,2,2,3,3,5,1]) 
set([1, 2, 3, 5]) 

Ok, w otrzymanych zestawów nie ma duplikatów. Co się stanie, jeśli obiekt na liście nie jest int, ale niektóre są zdefiniowane przeze mnie? Jaką metodę sprawdza, czy są różne? Zaimplementowałem __eq__ i __cmp__ z niektórymi obiektami, ale zestaw nie wydaje się ich używać: \

Czy ktoś wie, jak rozwiązać ten problem?

Odpowiedz

13

Zgodnie z , elementy muszą być hashable.

Obiekt jest hashable jeśli ma wartość skrótu, który nigdy się nie zmienia w trakcie jego trwania (potrzebuje metody __hash__()) i może być porównywany do innych obiektów (to wymaga __eq__() lub __cmp__() metody). Obiekty z możliwością dopasowania, które są równe, muszą mieć tę samą wartość skrótu.

EDIT: dodano odpowiednie Hashable definition dzięki Roberto

+0

"wtedy i tylko wtedy" nie ma sensu, choć. Hash może być użyty do wstępnego wyboru równych pozycji, ale z pewnością musi też nastąpić bezpośrednie porównanie rzeczywistych wartości lub wyniki zestawionych porównań byłyby raczej losowe. –

+0

Z dokumentacji pythona: Obiekt jest nieosiągalny, jeśli ma wartość skrótu, która nigdy nie zmienia się w trakcie jego trwania (wymaga metody __hash __()) i można ją porównać z innymi obiektami (wymaga __eq __() lub __cmp __() metoda). Obiekty z możliwością dopasowania, które są równe, muszą mieć tę samą wartość skrótu. –

+0

edytowane w odpowiedzi użytkownika. – TheSoftwareJedi