Bạn đang cố gắng sử dụng dict
làm chìa khóa cho người khác dict
hoặc trong một set
. Điều đó không hoạt động vì các khóa phải được băm. Theo nguyên tắc chung, chỉ các đối tượng bất biến (chuỗi, số nguyên, số float, fro chục, bộ dữ liệu bất biến) là có thể băm (mặc dù có thể có ngoại lệ). Vì vậy, điều này không hoạt động:
>>> dict_key = {"a": "b"}
>>> some_dict[dict_key] = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
Để sử dụng một dict làm khóa, bạn cần biến nó thành một cái gì đó có thể được băm trước. Nếu dict bạn muốn sử dụng làm khóa chỉ bao gồm các giá trị bất biến, bạn có thể tạo một đại diện có thể băm của nó như thế này:
>>> key = frozenset(dict_key.items())
Bây giờ bạn có thể sử dụng key
làm khóa trong một dict
hoặc set
:
>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}
Tất nhiên bạn cần phải lặp lại bài tập bất cứ khi nào bạn muốn tìm kiếm một cái gì đó bằng cách sử dụng một lệnh:
>>> 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
Nếu khóa dict
bạn muốn sử dụng làm khóa có các giá trị mà chính chúng là các ký tự và / hoặc danh sách, bạn cần đệ quy "đóng băng" khóa tiềm năng. Đây là điểm khởi đầu:
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