본문 바로가기

💻 Computer Science/python & module 🐤

[python] IndexError: list index out of range

728x90
반응형

리스트를 다룰때(특히 리스트의 요소를 넣다뺐다할때)자주 본 에러입니다. 말 그대로 리스트의 인덱스를 벗어나는 값을 호출할때 발생하는 에러죠. 예시를 봅시다.

 

1. 리스트에 없는 인덱스를 호출할때

list=[0,1,2,3,4,5]

print(list[6]) #IndexError: list index out of range

길이가 6인(원소의 갯수가 6개인) 리스트가 있다고 합시다. 파이썬에서 리스트는 0번부터 할당되므로, 첫번째 요소의 인덱스값은 0, 두번째는 1......마지막 여섯번째 요소의 인덱스값은 5입니다. 6번째 인덱스는 존재하지 않으므로 호출했을때 해당 에러가 발생합니다. 혹시 리스트 범위 밖 인덱스를 호출하고있는지 확인을 해봅시다. 

list=[0,1,2,3,4,5]

print(list[-7]) #IndexError: list index out of range

이것도 마찬가지입니다. list[-1]은 리스트의 가장 마지막 요소를 호출합니다. 위의 리스트는 6개의 요소가 있으므로 list[-6]은 가장 첫번째요소를 호출하겠죠. list[-7]은 위와 마찬가지로 없는 인덱스이므로 해당 에러를 출력합니다

 

2. 빈 리스트에서 인덱스호출

list=[]

print(list[2]) #IndexError: list index out of range

해당 리스트가 비었는지도 확인해줘야됩니다. 혹시 리스트에 어떤값을 append하는 구문이 잘 돌아가고있는지 확인해줍시다. 해당구문이 적용되지않아 빈 리스트상태로 남아있다면 해당 에러가 출력될수있습니다.

 

근데 그러면.. 리스트에 없는 요소값을 호출할때도 해당 에러가 발생할까요?

list=[0,1,2,3,4,5]

print(list.index(7)) #ValueError: 7 is not in list

아닙니다. 만약 요소가 0~5인 리스트에서 7을 찾는다면 IndexError이 아닌 ValueError이 발생합니다. IndexError은 리스트에 없는 인덱스를 호출하며 발생한 인덱스 에러죠

 

n=int(input())
list_s=[]

for i in range(n):
    s=str(input())
    list_s.append(s)

real_list=[]
min_idx=0

for i in range(1,n):

    if len(list_s[i])<len(list_s[min_idx]):

        min_idx=i

    min_len = list_s.pop(min_idx)
    real_list.append(min_len)

print(real_list) #IndexError: list index out of range

이번달 초?에 풀었던 ATM문제와 비슷한 코드입니다. 코드를 요약해보면 처음에 n개만큼의 단어(문자열)를 입력받습니다. n개의 문자열을 입력받은 순서대로 정렬한 리스트 list_s의 요소들을 문자열의 길이 순서대로 재정렬한 새로운 리스트 real_list를 생성합니다. 길이가 가장 짧은 요소를 list_s에서 추출해 real_list에 입력합니다. 남은 요소중 가장 짧은요소를 추출하여 또 real_list에 입력합니다. 해당과정을 반복하면 real_list엔 list_s의 요소들이 문자열 길이순대로 정렬되어있어야 합니다. 그러나 해당 구문에서도 IndexError이 발생하는데요...

 

위의 IndexError의 발생원인을 보면 어디서 문제가 발생했는지 금방 알수있습니다. 이 사태의 궁개새(궁극적 개새x)가 누굴까요..? 바로 pop입니다. list_s.pop을 하는순간 list_s의 길이는 줄어들게됩니다. 예를들어 요소가 5개여서 인덱스값이 0~4까지 존재할때 for문을 한번돌아 pop이 실행되면 요소4개에 인덱스값 0~3이 됩니다. 그러나 for문의 범위는 1~4(5-1)이므로 결국 존재하지않는 4번 인덱스를 호출하는 불상사가 발생하는것이지요..

 

ATM 문제풀이 글을 보면 이 난관을, for문에서 pop를 쓰지않는 방식으로 해결합니다. for문으로 최솟값만 찾는 함수를 정의하고 해당 함수에 대입하는 리스트를 계속 for문으로 바꿔가며 요소 빼고넣고를 반복합니다. 

무슨말인지 모르겠다구요? 사이버 노가다 인력사무소 ATM풀이글에 자세히 기술되어있읍니다...~ 한번 봐주시면 압도적인 감사를 드리겠습니다..

 

 

반응형