Python의 max() 함수는 최소 하나 이상의 값을 가진 시퀀스를 전달했을 때만 정상적으로 동작합니다.
빈 리스트에서 가장 큰 값을 찾으려고 하면 "ValueError: max() arg is an empty sequence" 오류가 발생합니다.
이 글에서는 이 오류가 무엇을 의미하는지, 왜 발생하는지 살펴보고, 실제 예제를 통해 해결 방법까지 단계별로 알아보겠습니다.
ValueError: max() arg is an empty sequence란?
max() 메서드는 리스트에서 가장 큰 항목을 찾을 때 사용합니다. 리스트에서 가장 작은 항목을 찾는 min() 메서드와 유사한 역할을 합니다.
이 메서드가 정상적으로 동작하려면 max()에 최소 하나 이상의 값을 가진 시퀀스를 전달해야 합니다. 빈 리스트에는 항목이 없기 때문에 '가장 큰 항목'이라는 개념 자체가 존재하지 않습니다.
참고로, 빈 리스트를 min() 메서드에 전달하면 "ValueError: min() arg is an empty sequence"라는 유사한 오류가 발생합니다. 원인은 동일합니다. 값이 없는 리스트에서는 가장 작은 값도 찾을 수 없기 때문입니다.
오류 발생 예제
학생들의 화학 시험 성적 중 가장 높은 점수를 찾는 프로그램을 만들어 보겠습니다. 먼저 학생 목록을 정의합니다:
students = [
{ "name": "Ron", "grades": [75, 92, 84] },
{ "name": "Katy", "grades": [92, 86, 81] },
{ "name": "Rachel", "grades": [64, 72, 72] },
{ "name": "Miranda", "grades": [] }
]
학생 목록에는 네 개의 딕셔너리가 들어 있으며, 각 딕셔너리에는 학생 이름과 해당 학생이 받은 성적 리스트가 포함되어 있습니다. Miranda는 화학 수업에 막 합류했기 때문에 아직 성적이 하나도 없습니다.
다음으로 for 반복문을 사용해 각 학생의 최고 점수와 평균 점수를 계산해 보겠습니다:
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() 함수로 학생이 받은 최고 점수를 구하고, 모든 성적의 합을 성적 개수로 나누어 평균 점수를 계산합니다.
round() 메서드를 사용해 각 학생의 평균 점수를 정수로 반올림합니다.
코드를 실행하면 다음과 같은 결과가 출력됩니다:
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, in <module> highest_grade = max(s["grades"]) ValueError: max() arg is an empty sequence
코드는 목록의 네 번째 항목에 도달하기 전까지는 정상적으로 실행됩니다. Ron, Katy, Rachel의 최고 점수와 평균 점수는 출력되지만, Miranda의 값은 어디에도 나타나지 않습니다.
해결 방법
처음 세 학생에게 코드가 정상 동작하는 이유는 각자 최소 한 개 이상의 성적을 가진 리스트를 갖고 있기 때문입니다. 반면 Miranda는 아직 성적이 하나도 없습니다.
성적이 없기 때문에 max() 함수가 실행되지 못하고 실패합니다. max()는 빈 리스트에서 가장 큰 값을 찾을 수 없습니다.
이 오류를 해결하려면 리스트에서 최고 점수를 계산하기 전에 해당 성적 리스트에 값이 있는지 먼저 확인해야 합니다. 리스트가 비어 있다면 사용자에게 다른 안내 메시지를 보여주는 것이 좋습니다.
if 문을 사용해 계산을 수행하기 전에 학생이 성적을 가지고 있는지 확인해 보겠습니다:
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"]))
위 코드는 학생이 최소 한 개 이상의 성적을 받았을 때만 최고 점수와 평균 점수를 계산합니다. 그렇지 않은 경우에는 해당 학생이 아직 성적이 없다는 메시지를 출력합니다. 코드를 다시 실행해 보겠습니다:
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.
처음 세 학생의 최고 점수와 평균 점수는 성공적으로 계산됩니다. 코드가 Miranda에 도달하면 그녀의 점수를 계산하는 대신, 아직 성적이 없다는 안내 메시지를 출력하며 프로그램이 오류 없이 끝까지 실행됩니다.
마무리
"ValueError: max() arg is an empty sequence" 오류는 max() 메서드로 빈 리스트에서 가장 큰 항목을 찾으려고 할 때 발생합니다.
이 오류를 해결하려면 max()에 최소 하나 이상의 값을 가진 리스트만 전달해야 합니다. 필요하다면 len()으로 리스트 길이를 확인하거나 기본값을 지정하는 방식으로 빈 리스트 상황을 미리 처리하세요. 이제 여러분도 전문 개발자처럼 이 문제를 손쉽게 해결할 수 있습니다!