Cách sửa lỗi "TypeError: object is not subscriptable" trong Python

Hiểu về hệ thống kiểu (type) trong Python là chìa khóa để giải quyết lỗi TypeError. Dưới đây là chi tiết cách sửa lỗi "TypeError: object is not subscriptable" trong Python.

Lập trình Python

Cố gắng truy xuất dữ liệu từ một đối tượng và thấy báo lỗi "object is not subscriptable"? Vấn đề ở đây là bạn đang index sai kiểu dữ liệu. Hãy cùng nhau tìm hiểu về các kiểu “subscriptable” và cách sửa lỗi TypeError nhé!

Subscriptable trong Python là gì?

Khái niệm “subscriptable” trong Python nghĩa là một kiểu dữ liệu chứa nhiều giá trị mà bạn có thể truy cập riêng từng giá trị.

Bạn có thể vào một giá trị cụ thể từ kiểu dữ liệu subscriptable qua index của nó, dùng ký hiệu dấu ngoặc vuông ([]).

Nếu cố gắng truy cập các mục trong kiểu dữ liệu không thể index, Python sẽ báo: "TypeError: object is not subscriptable".

Những kiểu dữ liệu sau có thể subscriptable trong Python: lists, strings, tuples, và dictionaries.

list_example = [1, 3, 5, "Idowu"]
string_example = "Idowu Omisola"
tuple_example = (1, 3, 5, "Idowu")
dict_example = {"name": "Idowu", "Language": "Yoruba"}

print(list_example[0]) # 1
print(string_example[3]) # w
print(tuple_example[1]) # 3
print(dict_example["name"]) # Idowu 

Tuy nhiên, set, integer, float, và Boolean không thể truy cập qua index, vì thế chúng không thể subscriptable:

float_example = 12.45
int_example = 12367
bool_example = True
set_example = {1, 3, 5, "Python"}

print(float_example[1])
print(bool_example[2])
print(int_example[2])
print(set_example[2])

Cố gắng chạy từng lệnh này sẽ cho ngoại lệ "object is not subscriptable":

Cửa sổ báo TypeError trong Python

Khắc phục lỗi "TypeError: object is not subscriptable" trong Python

Sửa lỗi "object is not subscriptable" dễ hơn khi bạn hiểu các quy tắc để truy cập từng kiểu dữ liệu. Vì thế, bắt đầu gỡ lỗi Python bằng cách kiểm tra kiểu dữ liệu của đối tượng đang muốn index.

float_example = 12.45
int_example = 12367
bool_example = True
set_example = {1, 3, 5, "Python"}

print(type(float_example)) # <class 'float'>
print(type(int_example)) # <class 'int'>
print(type(bool_example)) # <class 'bool'>
print(type(set_example)) # <class 'set'>

Sau khi đã xác định kiểu dữ liệu không thể subscriptable, chuyển đổi nó sang kiểu có thể index để giải quyết vấn đề. Điều này hữu ích nếu dữ liệu đến từ API bên thứ ba. Chuyển đổi kiểu dữ liệu như integer, float và Boolean thành chuỗi khiến chúng subscriptable:

print(str(float_example)[:2]) # 12
print(str(int_example)[:2]) # 12
print(str(bool_example)[:2]) # Tr

Thậm chí bạn có thể thao tác các kết quả chuỗi Python như ý muốn. Nếu đang phải xử lý integer và float, có thể bạn muốn dữ liệu kiểu dữ liệu gốc trong output. Để làm việc này, chuyển đổi giá trị kết quả vào kiểu dữ liệu gốc sau khi index chúng dưới dạng chuỗi:

converted_float = float(str(float_example)[:2])
converted_int = int(str(int_example)[:2])

# 12.0 Data type:<class 'float'>
print(converted_float, f'Data type:{type(converted_float)}')

# 12 Data type:<class 'int'> 
print(converted_int, f'Data type:{type(converted_int)}')

Đối với một set, bạn có thể biến nó thành list bằng list(set) một dòng trong Python nhưng điều đó không bảo toàn các vị trí mục trong danh sách kết quả. Để đảm bảo bạn nhận được một danh sách với các vị trí mục được giữ nguyên, hãy sử dụng hàm lambda của Python như sau:

set_example = {1, 3, 5, "Python"}
converted = sorted(set_example, key=lambda x: (isinstance(x, str), x))

print(converted[3]) # Python

Trên đây là cách sửa lỗi TypeError: object is not subscriptable trong Python. Hi vọng bài viết hữu ích với các bạn.

Thứ Tư, 05/07/2023 13:58
51 👨 1.013
0 Bình luận
Sắp xếp theo
    ❖ Python