Từ điển Python chỉ chấp nhận các kiểu dữ liệu có thể băm làm khóa trong từ điển. Danh sách không phải là một kiểu dữ liệu có thể băm. Nếu bạn chỉ định một danh sách làm khóa trong từ điển, bạn sẽ gặp phải lỗi “TypeError:unhashable type:‘ list ’”.
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 bạn thấy lỗi này trong mã của mình. Chúng tôi sẽ đi qua một ví dụ về lỗi này để chỉ cho bạn cách giải quyết.
TypeError:unhashable type:'list'
Từ điển có hai phần:khóa và giá trị. Khóa là các nhãn được liên kết với một giá trị cụ thể. Để truy cập một giá trị, bạn phải tham chiếu đến tên khóa của giá trị đó.
Mặc dù các giá trị có thể thuộc bất kỳ kiểu dữ liệu nào, từ danh sách đến chuỗi, nhưng chỉ các đối tượng có thể băm mới được chấp nhận làm khóa. Các đối tượng có thể băm là các đối tượng có giá trị băm không thay đổi theo thời gian. Ví dụ về các đối tượng có thể băm là bộ giá trị và chuỗi.
Danh sách không có giá trị băm không thay đổi. Giá trị băm của chúng có thể thay đổi theo thời gian. Điều này có nghĩa là bạn không thể chỉ định danh sách làm khóa từ điển.
Một tình huống mẫu
Hãy xây dựng một chương trình tạo danh sách các học sinh có điểm trung bình trên 75. Danh sách này sẽ chứa các bản ghi từ điển của từng học sinh và điểm của họ. Để tạo từ điển này, chúng tôi sẽ làm việc từ một từ điển với danh sách tất cả học sinh trong một trường học và điểm của họ.
Hãy bắt đầu bằng cách xác định danh sách sinh viên và từ điển cho sinh viên hàng đầu của chúng tôi:
students = [ { "name": "Linda", "grades": [84, 82, 65] }, { "name": "Alex", "grades": [67, 68, 83] }, { "name": "Holly", "grades": [72, 74, 81] } ] top_students = {}
Mỗi giá trị trong danh sách "sinh viên" là một từ điển. Mỗi từ điển chứa hai khóa:tên và điểm. Chúng tôi đã định nghĩa một từ điển có tên “top_students” sẽ chứa thông tin về những sinh viên hàng đầu của chúng tôi.
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ọ.
Bây giờ chúng tôi đã định nghĩa từ điển này, chúng tôi sử dụng vòng lặp for để lọc ra những sinh viên có điểm trung bình trên 75 và thêm chúng vào từ điển mới của chúng tôi:
for s in students: average = sum(s["grades"]) / len(s["grades"]) if average > 75: top_students[s["grades"]] =s["name"]
Trong mỗi lần lặp lại của vòng lặp for, chúng tôi tính điểm trung bình của tất cả các điểm mà một học sinh đã đạt được. Chúng tôi làm điều này bằng cách chia tổng tất cả các lớp cho bao nhiêu điểm đã được ghi lại.
Tiếp theo, chúng tôi kiểm tra xem mức trung bình đó có lớn hơn 75 không. Nếu đúng, chúng tôi tạo một mục mới trong từ điển top_students với tên của một học sinh và điểm của họ.
Cuối cùng, chúng tôi in từ điển top_students ra bảng điều khiển để chúng tôi thấy tất cả những học sinh có điểm trung bình trên 75:
print(top_students)
Chạy mã của chúng tôi và xem điều gì sẽ xảy ra:
Traceback (most recent call last): File "main.py", line 11, in <module> top_students[s["grades"]] = s["name"] TypeError: unhashable type: 'list'
Mã của chúng tôi không thể thực thi thành công.
Giải pháp
Mã của chúng tôi hoạt động cho đến khi trình thông dịch đến dòng 11. Trên dòng này, mã của chúng tôi ghi:
top_students[s["grades"]] = s["name"]
Lỗi trong mã của chúng tôi là do chúng tôi đã cố gắng chỉ định một danh sách làm khóa trong từ điển. Khi mã của chúng tôi phân tích cú pháp dòng này trong lần lặp đầu tiên của vòng lặp, mã của chúng tôi sẽ cố gắng tạo một từ điển với khóa và giá trị sau:
{ [84, 82, 65]: "Linda" }
Đây là một từ điển không hợp lệ. Mã của chúng tôi cố gắng gán một danh sách dưới dạng một khóa không hoạt động.
Để giải quyết vấn đề này, chúng tôi sử dụng tên của học sinh làm khóa trong từ điển thay vì danh sách điểm:
top_students[s["name"]] = s["grades"]
Chúng tôi đã chỉ định danh sách các điểm dưới dạng giá trị thay vì dưới dạng khóa. Tên của học sinh là chìa khóa trong từ điển. Hãy chạy mã của chúng tôi:
{'Linda': [84, 82, 65], 'Holly': [72, 74, 81]}
Mã của chúng tôi tạo thành công một từ điển với thông tin về những sinh viên có thành tích cao nhất. Bất kỳ học sinh nào có điểm trung bình trong ba bài kiểm tra gần đây nhất của họ trên 75 sẽ được thêm vào từ điển.
Từ điển của chúng tôi chia nhỏ như sau:
- Các phím:Linda, Holly
- Giá trị:[84, 82, 65], [72, 74, 81]
Bởi vì chúng tôi hiện đang gán các chuỗi cho các tên khóa của mình, mã của chúng tôi sẽ hoạt động.
Kết luận
Lỗi “TypeError:unhashable type:‘ list ’” xuất hiện khi bạn cố gắng gán một danh sách làm khóa trong từ điển. Để giải quyết lỗi này, hãy đảm bảo bạn chỉ gán một đối tượng có thể băm, chẳng hạn như một chuỗi hoặc một bộ, làm khóa cho từ điển.
Bây giờ bạn đã sẵn sàng giải quyết lỗi này như một lập trình viên chuyên nghiệp!