Using Dictionaries in Sets - dict objects are unhashable?

Ben Cartwright bencvt at gmail.com
Tue Mar 21 20:30:47 EST 2006


Gregory Piñero wrote:
> Hey guys,
>
> I don't understand why this isn't working for me.  I'd like to be able
> to do this.  Is there another short alternative to get this
> intersection?
>
> [Dbg]>>> set([{'a':1},{'b':2}]).intersection([{'a':1}])
> Traceback (most recent call last):
>   File "<interactive input>", line 1, in ?
> TypeError: dict objects are unhashable

Assuming you're using Python 2.4+:

>>> d1 = {'a':1, 'b':2, 'c':3, 'd':5}
>>> d2 = {'a':1, 'c':7, 'e':6}
>>> dict((k, v) for k, v in d1.iteritems() if k in d2)
{'a': 1, 'c': 3}

Or if you're comparing key/value pairs instead of just keys:

>>> dict((k, v) for k, v in d1.iteritems() if k in d2 and d2[k]==v)
{'a': 1}

Finally, if you're on Python 2.3, use these versions (less efficient
but still functional):

>>> dict([(k, v) for k, v in d1.iteritems() if k in d2])
{'a': 1, 'c': 3}
>>> dict([(k, v) for k, v in d1.iteritems() if k in d2 and d2[k]==v])
{'a': 1}

--Ben




More information about the Python-list mailing list