Ngôn ngữ Python cụ thể về gì dùng làm khóa dictionary. Trong dictionary Python, tất cả khóa phải hashable (có thể băm).
Nếu bạn dùng kiểu khóa unhashable khi thêm khóa vào dictionary, gặp lỗi "TypeError: unhashable type: 'dict'".
Trong hướng dẫn này, nói về ý nghĩa lỗi và tại sao nêu lên. Chúng ta đi qua ví dụ lỗi để bạn học cách khắc phục trong mã.
TypeError: unhashable type: 'dict'
Dictionary bao gồm hai phần: khóa (keys) và giá trị (values). Khóa là định danh gán cho giá trị. Khi tham chiếu khóa, bạn truy xuất giá trị liên kết khóa đó.
Chỉ đối tượng hashable làm khóa dictionary. Đối tượng bất biến (immutable) như chuỗi, số nguyên, tuple, frozenset là hashable, với vài ngoại lệ. Dictionary, do đó, không dùng làm khóa dictionary.
Để thêm mục dictionary, phải chỉ định khóa hashable hợp lệ. Ví dụ, "name" khóa hợp lệ, nhưng { "name": "test" } không.
Tình huống ví dụ
Ở đây, viết chương trình thêm tất cả bánh bán hơn 5 lần tiệm bánh từ dictionary này sang dictionary khác.
Bắt đầu khai báo list bánh chứa dictionary mỗi bánh. Cũng định nghĩa dictionary lưu bánh bán hơn 5 lần.
81% người tham gia cho biết họ cảm thấy tự tin hơn về cơ hội việc làm công nghệ sau khi tham gia bootcamp. Được ghép nối với bootcamp ngay hôm nay.
Sinh viên trung bình tốt nghiệp bootcamp mất chưa đến sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được việc đầu tiên.
cakes = [ { "name": "Black Forest Gateau", "sold": 3 }, { "name": "Carrot Cake", "sold": 7 }, { "name": "Coconut and Lime Cake", "sold": 9 } ] sold_more_than_five = {} "cakes" list chứa ba dictionary. Mỗi dictionary hai khóa giá trị. Tên khóa "cake" và "sold".
Bây giờ, viết for lặp list bánh tìm bán hơn 5 lần. Những bánh thêm vào "sold_more_than_five":
for c in cakes: if c["sold"] > 5: sold_more_than_five[c] = c["sold"] print(c["name"] + " has been sold more than five times.") print(sold_more_than_five)
Trong for, so sánh "sold" mỗi dictionary lớn hơn 5. Nếu có, mục thêm "sold_more_than_five". Sau đó, thông báo in ra console bánh cụ thể bán hơn 5 lần.
Sau vòng lặp chạy, in "sold_more_than_five" ra console.
Chạy mã kiểm tra:
Traceback (most recent call last): File "main.py", line 16, in <module> sold_more_than_five[c] = c["sold"] TypeError: unhashable type: 'dict'
Mã báo lỗi.
Giải pháp
Mã không hoạt động vì cố tạo khóa dictionary dùng dictionary khác.
Giá trị "c" bằng dictionary từ list "cakes". Nghĩa là khi thêm mục "sold_more_than_five", vô tình thêm dictionary làm khóa:
sold_more_than_five[c] = c["sold"]
Khi "if" chạy trên "Carrot Cake", mã cố chạy:
sold_more_than_five[{"name": "Carrot Cake", "sold": 7}] = 7 Điều này vô hiệu vì thêm dictionary làm khóa dictionary. Khắc phục bằng dùng c["name"] tên khóa dictionary:
sold_more_than_five[c["name"]] = c["sold"]
Chạy mã với sửa đổi:
Carrot Cake has been sold more than five times. Coconut and Lime Cake has been sold more than five times. {'Carrot Cake': 7, 'Coconut and Lime Cake': 9} Mã chạy thành công. Giờ dùng tên mỗi bánh làm khóa thay vì dictionary.
Kết luận
Lỗi "TypeError: unhashable type: 'dict'" nêu lên khi cố tạo mục dictionary khóa là đối tượng unhashable. Chỉ đối tượng bất biến như chuỗi, tuple, số nguyên dùng làm khóa dictionary.
Khắc phục bằng đảm bảo chỉ dùng đối tượng hashable khi tạo mục dictionary. Bây giờ bạn đã sẵn sàng giải quyết lỗi Python phổ biến này như lập trình viên chuyên nghiệp!