Sie versuchen, a dictals Schlüssel für ein anderes dictoder in einem zu verwenden set. Das funktioniert nicht, weil die Schlüssel hashbar sein müssen. In der Regel sind nur unveränderliche Objekte (Zeichenfolgen, Ganzzahlen, Gleitkommazahlen, Frozensets, Tupel von unveränderlichen Objekten) hashbar (obwohl Ausnahmen möglich sind). Das funktioniert also nicht:
>>> dict_key = {"a": "b"}
>>> some_dict[dict_key] = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
Um ein Diktat als Schlüssel zu verwenden, müssen Sie es in etwas verwandeln, das möglicherweise zuerst gehasht wird. Wenn das Diktat, das Sie als Schlüssel verwenden möchten, nur aus unveränderlichen Werten besteht, können Sie eine hashbare Darstellung davon wie folgt erstellen:
>>> key = frozenset(dict_key.items())
Jetzt können Sie keyals Schlüssel in einem dictoder verwenden set:
>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}
Natürlich müssen Sie die Übung wiederholen, wenn Sie etwas mit einem Diktat nachschlagen möchten:
>>> 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
Wenn der dictSchlüssel, den Sie als Schlüssel verwenden möchten, Werte und / oder Listen enthält, müssen Sie den potenziellen Schlüssel rekursiv "einfrieren". Hier ist ein Ausgangspunkt:
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