Anda mencoba menggunakan dictsebagai kunci untuk yang lain dictatau dalam set. Itu tidak berfungsi karena kuncinya harus dapat hashable. Sebagai aturan umum, hanya objek yang tidak dapat diubah (string, integer, float, frozenset, tuple of immutables) yang dapat hashable (meskipun pengecualian dimungkinkan). Jadi ini tidak berhasil:
>>> dict_key = {"a": "b"}
>>> some_dict[dict_key] = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
Untuk menggunakan dikt sebagai kunci, Anda perlu mengubahnya menjadi sesuatu yang mungkin di-hash terlebih dahulu. Jika dikt yang ingin Anda gunakan sebagai kunci hanya terdiri dari nilai-nilai yang tidak dapat diubah, Anda dapat membuat representasi hash untuk itu seperti ini:
>>> key = frozenset(dict_key.items())
Sekarang Anda dapat menggunakan keysebagai kunci di dalam dictatau set:
>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}
Tentu saja Anda harus mengulang latihan kapan pun Anda ingin mencari sesuatu menggunakan dikt:
>>> 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
Jika dictAnda ingin menggunakan sebagai kunci memiliki nilai-nilai yang sendiri adalah dicts dan / atau daftar, Anda perlu secara rekursif "membekukan" kunci prospektif. Inilah titik awalnya:
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