Sie versuchen, eine dict
als Schlüssel zu einem anderen dict
oder in einer set
. Das funktioniert nicht, weil die Schlüssel hashfähig sein müssen. In der Regel sind nur unveränderliche Objekte (Strings, Integers, Floats, Frozensets, Tupel von unveränderlichen Objekten) hashfähig (Ausnahmen sind jedoch möglich). Dies 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 zuerst in etwas verwandeln, das gehasht werden kann. Wenn das Diktat, das Sie als Schlüssel verwenden möchten, nur aus unveränderlichen Werten besteht, können Sie eine Hash-Darstellung davon wie folgt erstellen:
>>> key = frozenset(dict_key.items())
Jetzt können Sie key
als Schlüssel in einer dict
o set
:
>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}
Natürlich müssen Sie die Übung jedes Mal wiederholen, wenn Sie etwas mit einem Diktat nachschlagen wollen:
>>> 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 le dict
die Sie als Schlüssel verwenden möchten, Werte hat, die selbst Dicts und/oder Listen sind, müssen Sie den zukünftigen Schlüssel rekursiv "einfrieren". Hier ist ein Ansatzpunkt:
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