adding elements to set

Peter Otten __peter__ at web.de
Thu Dec 8 11:49:42 EST 2011


Andrea Crotti wrote:

> I've wasted way too much time for this, which is surely not a Python bug,
> not something that surprised me a lot.
> 
> I stupidly gave for granted that adding an object to a set would first
> check if there are equal elements inside, and then add it.
> 
> As shown below this is not clearly the case..
> Is it possible to get that behaviour implementing another magic method
> in my C class or I just have use another function to check (as I'm doing
> now).
> 
> class C(object):
> 
>      def __init__(self, x):
>          self.x = x
> 
>      def __eq__(self, other):
>          return self.x == other.x
> 
> 
> if __name__ == '__main__':
>      s = set()
>      c1 = C(1)
>      c2 = C(1)
>      assert c1 == c2
>      s.add(c1)
>      s.add(c2)
> 
>      print len(s)

Python's sets are hash-based; you have to implement a __hash__() method for 
the elements that ensures that c1 == c2 implies hash(c1) == hash(c2).

>>> class C(object):                                                  
...     def __init__(self, x): self.x = x
...     def __eq__(self, other): return self.x == other.x
...     def __hash__(self): return hash(self.x)
...
>>> c1 = C(1)
>>> c2 = C(1)
>>> c1 == c2
True
>>> s = set()
>>> s.add(c1)
>>> s.add(c2)
>>> len(s)
1





More information about the Python-list mailing list