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