Computer >> Máy Tính >  >> Lập trình >> Python

Python TypeError:unhashable type:‘dict’ Solution

Ngôn ngữ Python cụ thể về những gì có thể được sử dụng làm khóa trong từ điển. Trong từ điển Python, tất cả các khóa phải có thể băm được.

Nếu bạn cố gắng sử dụng loại khóa không thể nhấn mạnh khi thêm khóa vào từ điển, bạn sẽ gặp phải lỗi “TypeError:unhashable type:‘ dict ’”.

Trong hướng dẫn này, chúng tôi nói về lỗi này có nghĩa là gì và tại sao nó lại xuất hiện. Chúng tôi xem qua một ví dụ về lỗi này để bạn có thể tìm hiểu cách giải quyết nó trong mã của mình.

TypeError:unhashable type:‘dict’

Từ điển bao gồm hai phần:khóa và giá trị. Khóa là số nhận dạng được liên kết với một giá trị. Khi bạn tham chiếu một khóa, bạn sẽ có thể truy xuất giá trị được liên kết với khóa đó.

Chỉ các đối tượng có thể băm mới có thể là khóa trong từ điển. Các đối tượng bất biến như chuỗi, số nguyên, bộ giá trị và dãy số có thể được băm, với một số ngoại lệ. Do đó, từ điển không thể được sử dụng như một khóa trong từ điển.

Để thêm một mục vào từ điển, bạn phải chỉ định một khóa băm hợp lệ. Ví dụ:“name” là một khóa hợp lệ, nhưng {“name”:“test”} thì không.

Một tình huống mẫu

Ở đây, chúng tôi viết một chương trình bổ sung tất cả các loại bánh đã được bán hơn năm lần tại một tiệm bánh từ từ điển này sang từ điển khác.

Bắt đầu bằng cách khai báo danh sách các loại bánh trong đó có từ điển về từng loại bánh. Chúng tôi cũng định nghĩa một từ điển trong đó chúng tôi có thể lưu trữ những chiếc bánh đã được bán nhiều hơn năm lần.

81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia một cuộc thi đào tạo. Kết hợp với bootcamp ngay hôm nay.

Sinh viên tốt nghiệp bootcamp trung bình đã dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.

cakes = [
	{
"name": "Black Forest Gateau", "sold": 3
},
{
"name": "Carrot Cake", "sold": 7
},
{
"name": "Coconut and Lime Cake", "sold": 9
}
]
sold_more_than_five = {}

Danh sách "bánh ngọt" của chúng tôi chứa ba từ điển. Mỗi từ điển chứa hai khóa và giá trị. Các tên chính là "bánh" và "bán".

Bây giờ, chúng tôi viết một vòng lặp for đi qua danh sách các loại bánh của chúng tôi và tìm những chiếc bánh đã được bán nhiều hơn năm lần. Những chiếc bánh đó sẽ được thêm vào từ điển “sell_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 vòng lặp for của chúng tôi, chúng tôi so sánh xem giá trị “đã bán” trong mỗi từ điển có lớn hơn 5. Nếu đúng, mục đó sẽ được thêm vào từ điển “sell_more_than_five” của chúng tôi. Sau đó, một thông báo được in ra bảng điều khiển thông báo cho người dùng rằng chiếc bánh cụ thể đã được bán hơn năm lần.

Khi vòng lặp của chúng tôi đã chạy, chúng tôi in từ điển “sell_more_than_five” vào bảng điều khiển.

Chạy mã của chúng tôi để đảm bảo chương trình của chúng tôi hoạt động:

Traceback (most recent call last):
  File "main.py", line 16, in <module>
	sold_more_than_five[c] = c["sold"]
TypeError: unhashable type: 'dict'

Mã của chúng tôi trả về lỗi.

Giải pháp

Mã của chúng tôi không hoạt động vì chúng tôi đang cố gắng tạo khóa từ điển bằng từ điển khác.

Giá trị của "c" bằng một từ điển trong danh sách "bánh" của chúng tôi. Điều này có nghĩa là khi chúng tôi cố gắng thêm một mục vào từ điển “sell_more_than_five”, chúng tôi đã vô tình cố gắng thêm một từ điển làm khóa:

sold_more_than_five[c] = c["sold"]

Khi câu lệnh “if” của chúng tôi được chạy trên bánh “Carrot Cake”, mã của chúng tôi sẽ cố gắng chạy:

sold_more_than_five[{"name": "Carrot Cake", "sold": 7}] = 7

Điều này không hợp lệ vì chúng tôi đang cố gắng thêm từ điển làm khóa trong từ điển. Chúng tôi có thể giải quyết vấn đề này bằng cách sử dụng c [“name”] làm tên cho khóa từ điển của chúng tôi:

sold_more_than_five[c["name"]] = c["sold"]

Chạy mã của chúng tôi với mã đã sửa đổi này:

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ã của chúng tôi chạy thành công. Giờ đây, chúng tôi đang sử dụng tên của mỗi chiếc bánh làm từ khóa thay vì từ điển.

Kết luận

Lỗi “TypeError:unhashable type:‘ dict ’” xuất hiện khi bạn cố gắng tạo một mục trong từ điển có khóa là một đối tượng không thể trộn được. Chỉ các đối tượng bất biến như chuỗi, bộ giá trị và số nguyên mới có thể được sử dụng làm khóa trong từ điển.

Để giải quyết lỗi này, hãy đảm bảo rằng bạn chỉ sử dụng các đối tượng có thể băm khi tạo một mục trong từ điển. Bây giờ, bạn đã sẵn sàng giải quyết lỗi Python phổ biến này như một nhà phát triển chuyên nghiệp!