Phương thức max() chỉ hoạt động nếu bạn truyền vào chuỗi (sequence) có ít nhất một giá trị.
Nếu bạn thử tìm mục lớn nhất trong danh sách rỗng, bạn sẽ gặp lỗi ValueError: max() arg is an empty sequence.
Trong hướng dẫn này, chúng ta nói về ý nghĩa lỗi này và tại sao bạn có thể gặp nó. Chúng ta đi qua ví dụ để giúp bạn tìm ra cách giải quyết.
ValueError: max() arg is an empty sequence
Phương thức max() cho phép tìm mục lớn nhất trong danh sách. Nó tương tự phương thức min() tìm mục nhỏ nhất.
Để phương thức này hoạt động, max() cần chuỗi có ít nhất một giá trị. Điều này là do bạn không thể tìm mục lớn nhất trong danh sách nếu không có mục. Mục lớn nhất không tồn tại vì không có mục để tìm kiếm.
Một biến thể của lỗi ValueError: max() arg is an empty sequence xuất hiện khi bạn truyền danh sách rỗng vào min(). Lỗi này là ValueError: min() arg is an empty sequence. Lỗi min() xảy ra vì cùng lý do: không thể tìm giá trị nhỏ nhất trong danh sách không có giá trị.
Ví dụ minh họa
Chúng ta sẽ xây dựng chương trình tìm điểm cao nhất học sinh đạt được trong tất cả bài kiểm tra hóa học. Đầu tiên, định nghĩa danh sách học sinh:
students = [
{ "name": "Ron", "grades": [75, 92, 84] },
{ "name": "Katy", "grades": [92, 86, 81] },
{ "name": "Rachel", "grades": [64, 72, 72] },
{ "name": "Miranda", "grades": [] }
]
Danh sách học sinh chứa bốn từ điển. Các từ điển chứa tên học sinh và danh sách điểm họ đạt. Miranda chưa có điểm vì vừa tham gia lớp hóa học.
Tiếp theo, dùng vòng lặp for duyệt mỗi học sinh và tìm điểm cao nhất và điểm trung bình:
for s in students:
highest_grade = max(s["grades"])
average_grade = round(sum(s["grades"]) / len(s["grades"]))
print("The highest grade {} has earned is {}. Their average grade is {}.".format(s["name"], highest_grade, average_grade))
Chúng ta dùng max() tìm điểm cao nhất. Để tính điểm trung bình, chia tổng điểm cho số lượng điểm.
Chúng ta làm tròn điểm trung bình mỗi học sinh đến số nguyên gần nhất dùng round().
Chạy mã:
The highest grade Ron has earned is 92. Their average grade is 84. The highest grade Katy has earned is 92. Their average grade is 86. The highest grade Rachel has earned is 72. Their average grade is 69. Traceback (most recent call last): File "main.py", line 10, inhighest_grade = max(s["grades"]) ValueError: max() arg is an empty sequence
Mã chạy thành công cho ba học sinh đầu. Chúng ta thấy điểm cao nhất và trung bình của Ron, Katy, Rachel. Không thấy giá trị cho Miranda.
Giải pháp
Mã hoạt động cho ba học sinh đầu vì mỗi học sinh có danh sách điểm ít nhất một điểm. Miranda chưa có điểm.
Vì Miranda không có điểm, hàm max() thất bại. max() không thể tìm giá trị lớn nhất trong danh sách rỗng.
Để khắc phục, kiểm tra xem danh sách điểm có giá trị không trước khi tính điểm cao nhất. Nếu danh sách rỗng, hiển thị thông báo khác.
Dùng câu lệnh "if" kiểm tra xem học sinh có điểm trước khi tính toán:
for s in students:
if len(s["grades"]) > 0:
highest_grade = max(s["grades"])
average_grade = round(sum(s["grades"]) / len(s["grades"]))
print("The highest grade {} has earned is {}. Their average grade is {}.".format(s["name"], highest_grade, average_grade))
else:
print("{} has not earned any grades.".format(s["name"]))
Mã trên chỉ tính điểm cao nhất và trung bình nếu học sinh có ít nhất một điểm. Ngược lại, thông báo học sinh chưa có điểm. Chạy mã:
The highest grade Ron has earned is 92. Their average grade is 84. The highest grade Katy has earned is 92. Their average grade is 86. The highest grade Rachel has earned is 72. Their average grade is 69. Miranda has not earned any grades.
Mã tính thành công điểm cao nhất và trung bình cho ba học sinh đầu. Khi đến Miranda, mã không tính điểm mà thông báo Miranda chưa có điểm.
Kết luận
Lỗi ValueError: max() arg is an empty sequence xảy ra khi bạn thử tìm mục lớn nhất trong danh sách rỗng dùng max().
Để khắc phục, đảm bảo bạn chỉ truyền danh sách có ít nhất một giá trị qua câu lệnh max(). Bây giờ bạn đã có kiến thức khắc phục vấn đề này như coder chuyên nghiệp!