파이썬에서 리스트(List)는 인덱스 번호를 사용해 항목에 접근합니다. 이 인덱스 번호는 반드시 정수여야 하며, 만약 부동 소수점(float) 숫자로 리스트 항목에 접근하려고 하면 "TypeError: list indices must be integers or slices, not float" 오류가 발생합니다.
이 글에서는 해당 오류가 무엇을 의미하는지, 왜 발생하는지 살펴보고 실제 예제를 통해 해결 방법까지 단계별로 알아보겠습니다.
TypeError: list indices must be integers or slices, not float란?
리스트에 항목이 추가되면 각 항목에는 자동으로 인덱스 값이 할당됩니다. 인덱스 값은 0부터 시작하며, 새로운 항목이 추가될 때마다 1씩 증가합니다. 덕분에 개별 항목에 쉽게 접근할 수 있습니다. 첫 번째 항목의 인덱스는 0, 두 번째 항목은 1이 되는 식입니다.
그러나 리스트에서 항목을 가져올 때 부동 소수점 숫자는 사용할 수 없습니다. 부동 소수점은 별개의 데이터 타입이기 때문에 파이썬에서 다르게 처리됩니다. 리스트는 정수로 인덱싱되므로, 정수형 인덱스만 허용됩니다.
오류 발생 예시
테니스 대회 참가자 정보를 조회하는 프로그램을 만들어 보겠습니다. 먼저 리스트 안에 리스트를 포함하는 구조를 정의합니다. 이 리스트에는 대회 참가자 전원의 정보가 담깁니다.
participants = [
["Alex Rogers", 5, 2],
["Linda Patterson", 3, 4],
["Ruby Spencer", 1, 6]
]
참가자 리스트는 세 개의 리스트를 포함하고 있으며, 각 리스트에는 참가자 이름, 승리 횟수, 패배 횟수가 순서대로 저장되어 있습니다. 값들은 플레이어의 승리 횟수를 기준으로 정렬되어 있습니다.
다음으로 사용자에게 조회하고 싶은 선수를 입력받습니다. input() 함수를 사용합니다.
player_to_find = float(input("찾으려는 선수의 리더보드 순위를 입력하세요: "))
사용자가 입력하는 숫자는 리더보드에서 선수의 순위와 일치해야 합니다. Alex Rogers가 1위이므로, 그의 정보를 보려면 1을 입력하면 됩니다.
여기서 코드에서 나중에 인덱싱을 사용할 것이기 때문에 입력값을 float()으로 변환했습니다. 인덱스 값은 숫자이므로 연산 가능한 숫자 형태가 필요하다고 생각한 것입니다.
다음으로 인덱싱을 사용해 사용자가 찾는 선수의 정보를 가져옵니다.
player_info = participants[player_to_find - 1]
사용자가 입력한 값으로 "participants" 리스트에서 개별 선수의 기록을 찾습니다. 리스트는 0부터 인덱싱되고 리더보드 1위 선수가 첫 번째 위치에 있으므로, "player_to_find"에서 1을 빼줍니다.
이어서 해당 참가자의 정보를 콘솔에 출력합니다.
print("Name: {}".format(player_info[0]))
print("Wins: {}".format(player_info[1]))
print("Losses: {}".format(player_info[2]))
선수의 이름, 승리 게임 수, 패배 게임 수를 콘솔에 표시합니다. 프로그램을 실행해 보겠습니다.
찾으려는 선수의 리더보드 순위를 입력하세요: 2
Traceback (most recent call last):
File "main.py", line 9, in <module>
player_info = participants[player_to_find - 1]
TypeError: list indices must be integers or slices, not float
프로그램에 리더보드 순위를 입력하는 순간 오류가 발생합니다.
해결 방법
문제의 원인은 사용자 입력값을 float() 메서드로 변환한 데 있습니다. 이후 "participants" 리스트에서 항목을 가져올 때 부동 소수점 숫자로 인덱싱을 시도하게 되면서 오류가 발생한 것입니다.
이 문제를 해결하려면 사용자가 입력한 값을 부동 소수점이 아닌 정수(int)로 변환해야 합니다. int() 메서드를 사용하면 됩니다.
player_to_find = int(input("찾으려는 선수의 리더보드 순위를 입력하세요: "))
이제 정수 값을 가지게 되었으므로 인덱싱을 통해 리스트에서 항목을 정상적으로 가져올 수 있습니다. 코드를 다시 실행해 결과를 확인해 보겠습니다.
찾으려는 선수의 리더보드 순위를 입력하세요: 2 Name: Linda Patterson Wins: 3 Losses: 4
코드가 성공적으로 실행되어 리더보드 2위에 있는 Linda Patterson 선수의 기록(승리 3회, 패배 4회)이 정상적으로 출력됩니다.
마무리
"TypeError: list indices must be integers or slices, not float" 오류는 부동 소수점 숫자로 리스트 항목에 접근하려고 할 때 발생합니다. 이 오류를 해결하려면 인덱스 값으로 리스트 항목에 접근할 때 반드시 정수만 사용해야 합니다.
핵심 정리는 다음과 같습니다.
- 리스트 인덱스는 항상 정수(integer) 또는 슬라이스(slice)여야 합니다.
- 사용자 입력을 받을 때는
int()로 변환하는 것이 안전합니다. - 부동 소수점이 꼭 필요한 경우, 인덱싱 직전에
int()로 한 번 더 변환할 수 있습니다.
이제 여러분도 이 오류를 코드에서 손쉽게 진단하고 해결할 준비가 되었습니다!