Vous essayez d'utiliser a dictcomme clé d'un autre dictou dans un fichier set. Cela ne fonctionne pas car les clés doivent être hachables. En règle générale, seuls les objets immuables (chaînes, entiers, flottants, frozensets, tuples d'immuables) sont hachables (bien que des exceptions soient possibles). Donc cela ne fonctionne pas:
>>> dict_key = {"a": "b"}
>>> some_dict[dict_key] = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
Pour utiliser un dict comme clé, vous devez d'abord le transformer en quelque chose qui peut être haché. Si le dict que vous souhaitez utiliser comme clé se compose uniquement de valeurs immuables, vous pouvez en créer une représentation hachable comme ceci:
>>> key = frozenset(dict_key.items())
Vous pouvez maintenant utiliser keycomme clé dans un dictou set:
>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}
Bien sûr, vous devez répéter l'exercice chaque fois que vous souhaitez rechercher quelque chose à l'aide d'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 la dictclé que vous souhaitez utiliser a des valeurs qui sont elles-mêmes des dictionnaires et / ou des listes, vous devez "figer" récursivement la clé prospective. Voici un point de départ:
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