เมธอด max() ทำงานได้ก็ต่อเมื่อส่ง sequence ที่มีอย่างน้อย 1 ค่าเข้าไปใน method
ถ้าพยายามหา largest item ใน empty list จะเจอ error ValueError: max() arg is an empty sequence
คู่มือนี้พูดถึง error นี้หมายถึงอะไร ทำไมจึงเจอ พร้อมตัวอย่าง ช่วย figure out วิธีแก้ error นี้
ValueError: max() arg is an empty sequence
max() method หา largest item ใน list คล้าย min() method หา smallest item
เพื่อให้ method ทำงาน max() ต้องการ sequence ที่มีอย่างน้อย 1 ค่า เพราะไม่สามารถหา largest item ใน list ได้ถ้าไม่มี items Largest item ไม่ exist เพราะไม่มี items ให้ search through
Variation ของ error นี้เจอตอนส่ง empty list เข้า min() method error คือ ValueError: min() arg is an empty sequence เกิดจากเหตุผลเดียวกัน: ไม่สามารถหา smallest value ใน list ที่ไม่มี values ได้
ตัวอย่างสถานการณ์ (An Example Scenario)
สร้างโปรแกรมหาเกรดสูงสุดที่นักเรียนได้ในสอบเคมีทั้งหมด เริ่มกำหนดลิสต์นักเรียน:
students = [
{ "name": "Ron", "grades": [75, 92, 84] },
{ "name": "Katy", "grades": [92, 86, 81] },
{ "name": "Rachel", "grades": [64, 72, 72] },
{ "name": "Miranda", "grades": [] }
]
ลิสต์นักเรียนมี 4 dictionaries มีชื่อและลิสต์เกรดที่ได้ Miranda ไม่มีเกรดเพิ่งเข้าเรียนเคมี
ใช้ for loop วนแต่ละนักเรียน หา highest grade แต่ละคนและ average grade:
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))
ใช้ max() function หา highest grade ที่นักเรียนได้ คำนวณ average grade: หาร total ทุกเกรดด้วยจำนวนเกรดที่ได้
ปัด average grade ให้ nearest whole number ด้วย round() method รันโค้ด:
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
โค้ดรันสำเร็จจนถึง item ที่ 4 เห็น highest และ average grades ของ Ron, Katy, Rachel ไม่เห็นค่า Miranda
วิธีแก้ (The Solution)
โค้ดทำงาน 3 คนแรก เพราะแต่ละคนมี grades list อย่างน้อย 1 grade Miranda ไม่มี grades เลย
เพราะ Miranda ไม่มี grades max() function fail ไม่สามารถหา largest value ใน empty list ได้
แก้ error: เช็คว่าแต่ละ grades list มี values หรือไม่ ก่อนคำนวณ highest grade ถ้า list ไม่มี values ควรแสดงข้อความอื่นให้ user
ใช้ "if" statement เช็คว่านักเรียนมี grades หรือไม่ ก่อนคำนวณ:
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"]))
โค้ดข้างบนคำนวณ highest และ average grade ก็ต่อเมื่อมีอย่างน้อย 1 grade ไม่งั้น user จะได้รับแจ้งว่านักเรียนยังไม่มีเกรด รันโค้ด:
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.
โค้ดคำนวณ highest และ average grades 3 คนแรกสำเร็จ ตอนถึง Miranda ไม่คำนวณ แจ้งว่า Miranda ยังไม่มีเกรด
สรุป
Error ValueError: max() arg is an empty sequence เกิดเมื่อพยายามหา largest item ใน empty list ด้วย max() method
วิธีแก้: ให้แน่ใจว่าส่ง lists ที่มีอย่างน้อย 1 value ผ่าน max() statement เท่านั้น ตอนนี้คุณมีความรู้แก้ปัญหานี้อย่าง professional coder แล้ว!