리스트를 출력하다 보면 값 옆에 번호도 붙이고 싶을 때가 있어요. 공부할 주제를 1번, 2번, 3번으로 보여 주는 식이죠. 이럴 때 쓰기 좋은 함수가 enumerate()예요.
topics = ["변수", "조건문", "반복문"]
for index, topic in enumerate(topics):
print(index, topic)
출력은 다음과 같아요.
0 변수
1 조건문
2 반복문
enumerate()는 반복할 때마다 번호와 값을 한 쌍으로 건네줘요. 기본 번호는 0부터 시작하므로, 이 예제에서는 리스트 인덱스와 같아요.
번호만 필요하다면 range()를 쓰면 되고, 값만 필요하다면 for topic in topics로 충분해요. 둘 다 필요할 때 enumerate()를 떠올리면 됩니다.
for number, topic in enumerate(topics, start=1):
print(f"{number}. {topic}")
1. 변수
2. 조건문
3. 반복문
start=1은 붙여 주는 번호의 시작값을 바꿔요. 리스트 자체의 인덱스를 바꾸는 것은 아니에요.
그래서 이 반복문 안에서 topics[number]로 값을 꺼내면 의도와 달라져요. 첫 번째 반복에서 이미 두 번째 원소를 가리키고, 마지막에는 범위를 벗어나요. 옆에서 함께 받은 topic을 사용하면 됩니다.
minutes = [20, 45, 30, 10]
for day, minute in enumerate(minutes, start=1):
if minute >= 30:
print(f"{day}일차: {minute}분")
2일차: 45분
3일차: 30분
목표를 채운 날만 출력하지만 번호가 1, 2로 다시 매겨지지는 않아요. 원래 기록을 순서대로 돌면서 번호를 붙였기 때문이에요. 달성한 날을 1번부터 다시 세고 싶다면 필터링한 결과에 번호를 붙여야 해요.
빈 리스트라면 반복문 본문은 한 번도 실행되지 않아요. 별도 예외 처리 없이 자연스럽게 끝납니다.
번호가 원래 위치인지, 화면에 보여 줄 순번인지를 정해 두면 변수 이름도 고르기 쉬워요. 인덱스에는 index, 표시용 번호에는 number처럼 역할을 드러내 두려고 해요.