Estás intentando usar a dictcomo clave para otro dicto en a set. Eso no funciona porque las claves tienen que ser hashaable. Como regla general, solo los objetos inmutables (cadenas, enteros, flotadores, congeladores, tuplas de inmutables) son hashables (aunque son posibles excepciones). Entonces esto no funciona:
>>> dict_key = {"a": "b"}
>>> some_dict[dict_key] = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
Para usar un dict como clave, debe convertirlo en algo que se pueda descifrar primero. Si el dict que desea utilizar como clave consta solo de valores inmutables, puede crear una representación hashaable de esta manera:
>>> key = frozenset(dict_key.items())
Ahora puede usar keycomo clave en un dicto set:
>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}
Por supuesto, debe repetir el ejercicio cada vez que desee buscar algo con un dict:
>>> some_dict[dict_key] # Doesn't work
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> some_dict[frozenset(dict_key.items())] # Works
True
Si el dictque desea utilizar como clave tiene valores que son dictados y / o listas, debe "congelar" recursivamente la clave prospectiva. Aquí hay un punto de partida:
def freeze(d):
if isinstance(d, dict):
return frozenset((key, freeze(value)) for key, value in d.items())
elif isinstance(d, list):
return tuple(freeze(value) for value in d)
return d