Giá trị trong từ điển Python không thể cắt (slice) như danh sách. Điều này là do từ điển có thể có khóa tùy chỉnh. Chúng không được chỉ mục từ 0. Nếu bạn thử cắt từ điển như danh sách, bạn sẽ gặp lỗi TypeError: unhashable type: 'slice'.
Hướng dẫn này thảo luận về ý nghĩa lỗi này và tại sao bạn thấy nó trong mã. Nó thảo luận ví dụ để giúp bạn khắc phục.
TypeError: unhashable type: 'slice'
Một slice (ph lát) là tập con của chuỗi như chuỗi ký tự, danh sách, hoặc tuple. Tên cho thấy mục đích: nó là "một lát" của chuỗi.
Xét chương trình sau:
news_sites = ["New York Times", "Washington Post", "CNN"] print(news_sites[:2])
Mã này truy xuất hai giá trị đầu trong danh sách "news_sites" và in ra console. Mã trả về: ['New York Times', 'Washington Post'].
Đây là ví dụ của slicing. Bạn truy xuất hai đối tượng từ danh sách. Bằng cách chỉ định dấu hai chấm và giá trị chỉ mục, bạn báo cho Python đối tượng nào cần truy xuất.
Từ điển không thể cắt như danh sách. Từ điển không có số chỉ mục nên cú pháp này không áp dụng.
Ví dụ minh họa
Xây dựng chương trình hiển thị thông tin bàn phím bán tại cửa hàng phần cứng. Đầu tiên, định nghĩa từ điển dữ liệu bàn phím:
keyboard = {
"name": "Huntsman Mini",
"brand": "Razer",
"price": 119.99,
"switch_type": "Razer Switches",
}
Chương trình lưu thông tin tên bàn phím, giá, thương hiệu, và loại switch. Bạn chỉ muốn hiển thị: tên, thương hiệu, và giá.
Để làm điều này, dùng slicing truy xuất ba mục đầu trong từ điển. Các mục này là tên, thương hiệu, và giá:
show_to_customer = keyboard[:3]
Mã này truy xuất ba mục đầu trong từ điển. Tiếp theo, dùng vòng lặp for lặp qua danh sách này và in mỗi mục ra console:
for s in show_to_customer:
print(s[1])
Bạn dùng chỉ mục truy xuất giá trị từ mỗi bản ghi trong biến "show_to_customer". Sau đó in giá trị đó ra console dùng print().
Chạy mã:
Traceback (most recent call last): File "main.py", line 8, inshow_to_customer = keyboard[:3] TypeError: unhashable type: 'slice'
Mã trả về lỗi.
Giải pháp
Khác với danh sách, từ điển không thể cắt (slice). Bạn không thể truy xuất mục từ từ điển bằng slicing vì từ điển không có số chỉ mục. Dữ liệu lưu trong cặp khóa-giá trị. Vì từ điển không thể cắt, vòng lặp for trước không phù hợp.
Bạn phải chỉ định trực tiếp giá trị bạn muốn truy xuất từ từ điển. Để làm điều này, tham chiếu tên khóa phù hợp trong từ điển.
Để khắc phục mã, truy xuất riêng từng giá trị bạn muốn hiển thị:
keyboard = {
"name": "Huntsman Mini",
"brand": "Razer",
"price": 119.99,
"switch_type": "Razer Switches",
}
print("Name: " + keyboard["name"])
print("Brand: " + keyboard["brand"])
print("Price: $" + str(keyboard["price"]))
Mỗi câu lệnh print() tham chiếu giá trị khác từ từ điển. Câu đầu in nhãn "Name: " theo sau giá trị "name" trong từ điển. Hai câu tiếp theo in "brand" và "price" tương ứng.
Bạn chuyển giá trị "price" thành chuỗi dùng str() để nối với nhãn "Price: $" dùng toán tử cộng (+).
Chạy chương trình mới:
Name: Huntsman Mini Brand: Razer Price: $119.99
Mã in thành công ba thông tin bạn muốn hiển thị. Người dùng thấy tên, thương hiệu, và giá bàn phím.
Kết luận
Lỗi TypeError: unhashable type: 'slice' xảy ra khi bạn truy cập mục từ từ điển dùng cú pháp slicing. Để khắc phục, hãy tham chiếu trực tiếp các mục bạn muốn truy xuất từ từ điển.
Bây giờ bạn đã có kiến thức khắc phục lỗi này như chuyên gia!