파이썬 리스트 최댓값의 인덱스 구하기
리스트(list)에서 인덱싱을 활용하면 특정 항목이나 일정 범위의 항목들을 자유롭게 가져올 수 있습니다. 다만 리스트에서 원하는 값을 꺼내려면 그 값에 연결된 인덱스 번호를 알고 있어야 합니다.
리스트에서 가장 큰 값이 저장된 위치를 찾으려면 max() 함수와 index() 메서드를 조합하면 됩니다. 이 글에서는 리스트 안 최댓값의 인덱스를 반환하는 간단한 프로그램을 직접 만들어 보며 그 과정을 단계별로 살펴보겠습니다.
예제 프로그램: 최고 점수를 받은 학생 찾기
마지막 수학 시험에서 최고 점수를 받은 학생의 이름을 찾아 콘솔에 출력하는 프로그램을 작성해 보겠습니다. 먼저 두 개의 리스트를 생성합니다.
students = ["Andy", "April", "Julia", "Gary"] grades = [75, 82, 64, 68]
첫 번째 리스트에는 반 학생들의 이름이 들어 있고, 두 번째 리스트에는 각 학생의 성적이 순서대로 저장되어 있습니다.
이 두 리스트는 병렬 배열(parallel array)입니다. 즉, 두 배열의 크기가 같고 서로 같은 위치의 값들이 하나의 레코드를 이룹니다. "students"에는 이름이, "grades"에는 해당 학생이 받은 점수가 담겨 있습니다.
1단계: max()로 최댓값 찾기
먼저 리스트에서 가장 높은 점수를 구해야 합니다. 내장 함수 max()를 사용하면 됩니다.
largest = max(grades)
이 코드는 리스트에서 가장 큰 숫자를 반환합니다. 하지만 우리가 진짜로 원하는 것은 최댓값 자체가 아니라 최댓값의 인덱스 위치입니다. 이때 또 다른 내장 함수인 index()를 사용합니다.
2단계: index()로 최댓값의 위치 구하기
index_of_largest = grades.index(largest)
두 리스트가 병렬 배열이기 때문에, "grades" 리스트에서 최고 점수가 있는 인덱스 번호는 곧 "students" 리스트에서 그 점수를 받은 학생의 인덱스 번호와 동일합니다.
3단계: 결과 출력하기
이제 최고 점수를 받은 학생이 누구인지 알려주는 메시지를 콘솔에 출력합니다.
print("{} earned the highest grade in the class. Their grade was {}.".format(students[index_of_largest], largest))인덱싱 문법을 사용해 최고 점수를 받은 학생의 이름을 가져오고, 이 값과 점수를 문자열에 넣어 출력합니다. 프로그램을 실행하면 다음과 같은 결과가 나옵니다.
April earned the highest grade in the class. Their grade was 82.
프로그램이 성공적으로 최고 점수를 받은 학생을 찾아냈습니다. 참고로 최솟값의 인덱스를 찾고 싶다면 max() 대신 min() 함수를 사용하면 됩니다.
최댓값과 같은 값을 가진 모든 인덱스 찾기
그런데 만약 최고 점수를 받은 학생이 두 명이라면 어떻게 될까요? 앞서 작성한 프로그램은 특정 점수를 받은 첫 번째 학생의 인덱스만 반환하기 때문에, 나머지 학생들은 찾아내지 못합니다.
특정 점수를 받은 모든 학생을 찾으려면 리스트 컴프리헨션(list comprehension)을 활용할 수 있습니다. 먼저 기존과 같이 데이터를 초기화하고 최댓값을 구합니다.
students = ["Andy", "April", "Julia", "Gary", "Paul"] grades = [75, 82, 64, 68, 82] largest = max(grades)
두 명의 학생이 같은 점수를 받았을 때 어떤 일이 일어나는지 확인할 수 있도록 레코드를 하나 추가했습니다.
다음으로 리스트 컴프리헨션을 작성합니다. 이 코드는 특정 점수를 받은 모든 학생의 인덱스 위치를 찾아줍니다.
all_grades = [g for g, x in enumerate(grades) if x == largest]
이 코드는 "grades" 리스트의 모든 점수를 순회하면서 각 점수가 리스트의 최댓값과 같은지 비교하고, 값이 같으면 해당 인덱스를 새 리스트에 추가합니다.
enumerate() 함수는 리스트를 인덱스 번호와 값, 두 요소로 분리해 줍니다. 따라서 "g"는 리스트 항목의 인덱스를, "x"는 항목의 값을 의미합니다.
마지막으로 for 루프를 사용해 최고 점수를 받은 모든 학생에게 메시지를 출력합니다.
for g in all_grades:
print("{} earned the highest grade in the class. Their grade was {}.".format(students[g], grades[g]))여러 학생이 최고 점수를 받았다면 for 루프는 그 횟수만큼 반복 실행되며, 매번 해당 학생의 이름과 함께 최고 점수를 받았다는 메시지를 콘솔에 출력합니다. 프로그램을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
April earned the highest grade in the class. Their grade was 82. Paul earned the highest grade in the class. Their grade was 82.
프로그램이 최고 점수를 받은 모든 학생의 이름을 성공적으로 보여주고 있습니다.
마무리
리스트에서 항목의 인덱스 값을 구할 때는 index() 메서드를 사용합니다. 이 메서드를 min() 또는 max() 함수와 결합하면 리스트에서 가장 작은 값이나 가장 큰 값의 인덱스도 손쉽게 찾을 수 있습니다.
이제 여러분도 파이썬 전문가처럼 리스트에서 최댓값의 인덱스를 구할 수 있습니다!