Stai cercando di usare a dictcome chiave per un altro dicto in a set. Non funziona perché le chiavi devono essere hash. Come regola generale, solo gli oggetti immutabili (stringhe, numeri interi, float, frozenset, tuple di immutabili) sono hash (anche se sono possibili eccezioni). Quindi questo non funziona:
>>> dict_key = {"a": "b"}
>>> some_dict[dict_key] = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
Per usare un dict come chiave è necessario trasformarlo in qualcosa che potrebbe essere prima cestinato. Se il dict che desideri utilizzare come chiave è costituito solo da valori immutabili, puoi crearne una rappresentazione hash in questo modo:
>>> key = frozenset(dict_key.items())
Ora puoi usare keycome chiave in un dicto set:
>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}
Ovviamente devi ripetere l'esercizio ogni volta che vuoi cercare qualcosa usando 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
Se dictsi desidera utilizzare come chiave i valori sono essi stessi dicts e / o elenchi, è necessario "congelare" ricorsivamente la chiave futura. Ecco un punto di partenza:
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