TypeError: list indices must be integers or slices, not str
에러는 파이썬으로 프로그래밍하면서 꽤 자주 만나게 되는 에러이죠. 이 에러는 어떤 경우에 발생하고, 어떻게 해결하면 좋을지 알아봅시다.
에러 메시지의 가장 앞에 적혀있는 TypeError는 이 에러가 자료형(Data Type)과 관련된 에러임을 알려주는 것이라고 보시면 됩니다. 문자열(str), 정수(int), 실수(float), 리스트(list) 등의 자료형들이 있는데 이 자료형과 관련된 무언가에서 에러가 발생했다는 것입니다.
TypeError: list indices must be integers or slices, not str
역시 자료형과 관련된 에러인데요, 리스트의 인덱스를 정수형이 아닌 문자열으로 사용했을 때 만나는 에러입니다. 특히나 파이썬에서 for in 반복문을 사용할 때 인덱스를 문자로 받는 실수가 종종 나오곤 합니다.
파이썬에서는 리스트의 인덱싱이 가능하다고 배우셨을 것입니다. 보통 아래와 같은 생김새이죠.
mylist = ['코드잇', '최고', '리스트는', '정수로', '인덱싱', '하기']
mylist[2]
보통 직접 인덱스를 적어서 인덱싱 할 때 인덱스에 정수형이 아닌 문자열을 넣는 실수는 잘 하지 않습니다. (아래와 같은 실수는 잘 하지 않죠)
#리스트 인덱스로 문자열 사용
mylist = ['코드잇', '최고', '리스트는', '정수로', '인덱싱', '하기']
mylist['삼']
하지만 앞서 얘기한 것 처럼, for in 반복문의 사용법에 대한 오해로 인해 이 에러를 만나게 되는 경우는 비일비재합니다.
mylist = ['코드잇', '최고', '리스트는', '정수로', '인덱싱', '하기']
for item in mylist:
print(mylist[item])
Traceback (most recent call last):
File "main.py", line 4, in <module>
print(mylist[item])
TypeError: list indices must be integers or slices, not str
mylist = ['코드잇', '최고', '리스트는', '정수로', '인덱싱', '하기']
for item in mylist:
print(mylist[item])
위의 코드에서 item으로 지정해둔 변수가 가리키는 값에 대한 오해가 문제의 가장 큰 원인입니다. 이 에러를 만나는 분들은 보통 item이 리스트 각 요소의 인덱스를 담고있다고 오해합니다. 그래서 인덱싱할 때 item을 사용하려고 하는 것이죠.
하지면 여기에서 item은 mylist 각 요소의 값 그 자체이지, 그 값의 인덱스가 아닙니다.
이 반복문을 실행하면 아래 코드를 적은 것과 같은 결과를 확인할 수 있는 것이죠.
print(mylist['코드잇'])
print(mylist['최고'])
print(mylist['리스트는'])
print(mylist['정수로'])
print(mylist['인덱싱'])
print(mylist['하기'])
(아마 파이썬의 while문을 먼저 배우신 분들이라면, while문에서는 보통 숫자를 통해 반복을 제어하고 리스트의 각 요소들을 출력하고 싶을 때 역시 리스트의 인덱싱으로 풀어내기 때문에, for in 반복문 역시 비슷한 식으로 작동할 것이라고 오해하실 수 있습니다.)
원하시는 결과가 리스트 내부의 각 요소를 프린트 하는 것이라면 해결 방법은 간단합니다. 위의 코드에서 item은 mylist 각 요소의 값 그 자체라고 하였으니, 그냥 그 값을 프린트하면 해결되는 것이죠. item이라는 변수는 mylist 라는 리스트 각 요소의 인덱스를 담는 것이 아니라, 리스트 각 요소의 값을 그대로 받아오는 변수라는 점 확실히 인지하셔야 합니다!
mylist = ['코드잇', '최고', '리스트는', '정수로', '인덱싱', '하기']
for item in mylist:
print(item)
코드잇
최고
리스트는
정수로
인덱싱
하기
만약 for in 문을 이용해서 각 요소의 인덱스 번호를 출력하고 싶다면 어떻게 해야할까요?
그럴 때는 range
함수를 이용하거나, enumerate
함수를 사용하는 방법이 있습니다. 이 글에서는 직접 다루지 않으니 만약 궁금하시다면 직접 찾아보시는 것을 추천드려요!
이 글이 여러분의 문제 해결에 도움이 되었길 바랍니다.
혼자 파이썬 공부하다가 막막하다면, 기초 원리와 개념부터 차근차근 제대로 배울 수 있는 코드잇의 프로그래밍 기초 in Python 강의를 수강해보세요. 누구나 쉽고 재미있게 파이썬이라는 언어를 배우고 코딩에 대한 두려움을 떨쳐버릴 수 있을 거예요.