Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Giải pháp lỗi Python TypeError: list indices must be integers or slices, not float

Danh sách được chỉ mục bằng số chỉ mục (index numbers). Các số này là giá trị nguyên (integer). Nếu bạn thử truy xuất mục từ danh sách dùng số thực (floating-point), lỗi TypeError: list indices must be integers or slices, not float sẽ được ném ra.

Hướng dẫn này thảo luận ý nghĩa lỗi này và tại sao bạn có thể gặp nó. Chúng ta sẽ đi qua ví dụ để bạn học cách khắc phục.

TypeError: list indices must be integers or slices, not float

Khi mục được thêm vào danh sách, mục được gán giá trị chỉ mục. Giá trị chỉ mục bắt đầu từ 0 và tăng 1 cho mỗi mục mới. Điều này giúp dễ dàng truy xuất mục riêng lẻ. Mục đầu tiên có chỉ mục 0, mục thứ hai chỉ mục 1, và cứ thế.

Bạn không thể truy xuất mục từ danh sách dùng số thực. Số thực là kiểu dữ liệu khác. Do đó, chúng được Python xử lý khác. Danh sách mong đợi số chỉ mục nguyên vì danh sách được chỉ mục bằng số nguyên.

Ví dụ minh họa

Chúng ta xây dựng chương trình truy xuất thông tin người tham gia giải đấu tennis. Đầu tiên, định nghĩa danh sách các danh sách. Danh sách này chứa thông tin tất cả người tham gia:

participants = [
    ["Alex Rogers", 5, 2],
    ["Linda Patterson", 3, 4],
    ["Ruby Spencer", 1, 6]
]

Danh sách người tham gia chứa ba danh sách. Mỗi danh sách chứa tên, số trận thắng, và số trận thua, theo thứ tự đó.

Các giá trị được sắp xếp theo số lần thắng.

Tiếp theo, hỏi người dùng người chơi họ muốn xem thông tin. Dùng input():

player_to_find = float(input("Enter the leaderboard position of the player you want to find: "))

Số người dùng nhập nên tương ứng vị trí người chơi trên bảng xếp hạng. Alex Rogers là thứ nhất. Để tìm hiểu về anh ấy, người dùng nhập 1.

Chúng ta chuyển giá trị người dùng nhập thành float vì dùng chỉ mục sau trong mã. Giá trị chỉ mục là số và chúng ta cần số để làm việc.

Tiếp theo, dùng chỉ mục truy xuất người chơi người dùng tìm:

player_info = participants[player_to_find - 1]

Chúng ta dùng giá trị người dùng nhập tìm bản ghi người chơi từ danh sách "participants". Trừ 1 từ "player_to_find" vì danh sách chỉ mục từ 0 và người đầu tiên trên bảng xếp hạng ở vị trí #1.

Tiếp theo, in chi tiết người tham gia ra console:

print("Name: {}".format(player_info[0]))
print("Wins: {}".format(player_info[1]))
print("Losses: {}".format(player_info[2]))

Hiển thị tên, số trận thắng, số trận thua. Chạy chương trình:

Enter the leaderboard position of the player you want to find: 2
Traceback (most recent call last):
  File "main.py", line 9, in 
    player_info = participants[player_to_find + 1]
TypeError: list indices must be integers or slices, not float

Sau khi nhập vị trí, lỗi được ném ra.

Giải pháp

Chúng ta chuyển giá trị người dùng nhập thành float dùng float().

Đây là lỗi vì khi truy xuất mục từ "participants", chúng ta thử dùng số thực. Điều này gây lỗi.

Để sửa, chuyển giá trị người dùng nhập thành số nguyên (integer) thay vì float. Làm được bằng int():

player_to_find = int(input("Enter the leaderboard position of the player you want to find: "))

Bây giờ có giá trị nguyên, có thể truy xuất mục từ danh sách dùng chỉ mục. Chạy mã:

Enter the number of the player you want to find: 2
Name: Linda Patterson
Wins: 3
Losses: 4

Mã hiển thị thành công bản ghi người chơi vị trí #2.

Kết luận

Lỗi TypeError: list indices must be integers or slices, not float xảy ra khi truy xuất mục từ danh sách dùng số thực. Để khắc phục, đảm bảo chỉ dùng số nguyên truy xuất mục trong danh sách bằng chỉ mục.

Bây giờ bạn đã sẵn sàng khắc phục lỗi này trong mã như pro!