Python enumerate() 함수, 예제와 함께 설명
이 가이드에서는 파이썬의 enumerate() 함수 활용법을 상세히 안내합니다.
파이썬의 enumerate() 함수는 반복 가능한 객체(iterable)의 요소에 접근할 때 인덱스와 함께 간결하게 접근할 수 있는 방법을 제공합니다.
먼저, 기본적인 반복문(loop)을 이용해 요소와 인덱스에 접근하는 방식을 알아보고, 그 다음 enumerate() 함수의 문법을 자세히 살펴보겠습니다. 실제 코딩 예제를 통해 학습 효과를 높일 것입니다.
그럼, 시작해 볼까요?
파이썬의 for 반복문 사용법
반복 가능한(iterable) 객체는 한 번에 하나의 요소에 순차적으로 접근할 수 있는 파이썬 객체를 말합니다. 파이썬의 리스트, 튜플, 딕셔너리, 문자열 등이 모두 반복 가능한 객체입니다.
아래 코드에서 쇼핑 목록의 예시를 확인해 보겠습니다.
shopping_list = ["fruits","cookies","cereals","protein bars","post-it notes"]
파이썬에서는 for 반복문을 사용하여 모든 반복 가능한 객체를 순회할 수 있습니다. 기본 문법은 다음과 같습니다.
for item in <iterable>:
# item에 대한 작업 수행
# item: 반복 변수
# <iterable>: 리스트, 튜플, 딕셔너리, 문자열 등 파이썬의 모든 반복 가능한 객체
이제 이 문법을 활용하여 shopping_list를 순회하며 각 요소에 접근해 보겠습니다.
for item in shopping_list: print(item) # 결과 fruits cookies cereals protein bars post-it notes
이 구조는 요소에 직접 접근할 수 있게 해줍니다. 하지만 때로는 요소 자체뿐만 아니라 요소의 인덱스도 알아야 할 때가 있습니다.
다음처럼, 반복문 내부에서 증가하는 인덱스 변수를 사용할 수 있습니다.
index = 0
for item in shopping_list:
print(f"index:{index}, {item}")
index += 1
# 결과
index:0, fruits
index:1, cookies
index:2, cereals
index:3, protein bars
index:4, post-it notes
하지만 이 방식은 가장 효율적인 방법이 아닙니다. 인덱스 값을 증가시키는 것을 잊으면 코드가 예상대로 작동하지 않을 수 있습니다.
index = 0
for item in shopping_list:
print(f"index:{index}, {item}")
# 반복문 안에서 index가 업데이트되지 않음
# index는 항상 0임
# 결과
index:0, fruits
index:0, cookies
index:0, cereals
index:0, protein bars
index:0, post-it notes
for 반복문을 사용하는 또 다른 일반적인 패턴은 range() 함수와 함께 사용하는 것입니다. 다음 섹션에서 이에 대해 자세히 알아보겠습니다.
range() 함수를 활용한 인덱스 접근법
파이썬 내장 함수인 len()은 파이썬 객체의 길이를 반환합니다. 따라서 len() 함수에 shopping_list를 인자로 전달하면 shopping_list의 길이(이 경우 5)를 얻을 수 있습니다.
len(shopping_list) # 결과: 5
range() 함수는 반복문에서 사용할 수 있는 범위 객체를 반환합니다. range(stop)을 반복하면 인덱스 0, 1, 2,..., stop-1을 얻을 수 있습니다.
stop = len(list)로 설정하면 유효한 인덱스 목록을 얻을 수 있습니다. range() 함수를 사용하면 다음과 같이 인덱스와 해당 요소에 접근할 수 있습니다.
for index in range(len(shopping_list)):
print(f"index:{index}, item: {shopping_list[index]}")
# 결과
index:0, item: fruits
index:1, item: cookies
index:2, item: cereals
index:3, item: protein bars
index:4, item: post-it notes
하지만 이것은 인덱스와 요소에 동시에 접근하는 데 권장되는 파이썬 방식은 아닙니다.
파이썬 enumerate() 함수의 구문
파이썬의 enumerate() 함수를 사용하면 다음 기본 문법으로 인덱스와 함께 요소에 접근할 수 있습니다.
enumerate(<iterable>, start = 0)
위 문법에서:
<iterable>은 필수 매개변수이며, 리스트나 튜플과 같은 모든 파이썬 반복 가능한 객체가 될 수 있습니다.start는 선택적 매개변수로, 카운팅이 시작되는 인덱스를 지정합니다.start값을 지정하지 않으면 기본값은 0입니다.
이제 shopping_list를 사용하여 enumerate() 함수를 호출하면, 아래 코드처럼 enumerate 객체가 반환됩니다.
enumerate(shopping_list) <enumerate object at 0x7f91b4240410>
enumerate 객체는 직접적으로 반복할 수 없습니다. enumerate 객체를 파이썬 리스트로 변환해 보겠습니다.
list(enumerate(shopping_list)) # 결과 [(0, 'fruits'), (1, 'cookies'), (2, 'cereals'), (3, 'protein bars'), (4, 'post-it notes')]
enumerate 객체의 요소에 접근하는 또 다른 방법은 next() 함수를 호출하는 것입니다. 파이썬에서 next() 함수는 반복자의 다음 요소를 반환합니다.
내부적으로 next() 함수는 연속적인 요소를 가져오기 위해 반복자 객체에서 __next__ 메서드를 호출하여 작동합니다.
enumerate 객체를 shopping_list_enum 변수에 할당해 보겠습니다.
shopping_list_enum = enumerate(shopping_list)
shopping_list_enum으로 next()를 처음 호출하면 인덱스 0과 인덱스 0에 있는 요소인 튜플(0, ‘fruits’)을 얻습니다.
next() 함수를 계속 호출하면 아래와 같이 인덱스와 함께 연속적인 요소를 얻게 됩니다.
next(shopping_list_enum) # (0, 'fruits') next(shopping_list_enum) # (1, 'cookies') next(shopping_list_enum) # (2, 'cereals') next(shopping_list_enum) # (3, 'protein bars') next(shopping_list_enum) # (4, 'post-it notes')
모든 요소에 접근하고 리스트의 끝에 도달한 후 next() 함수를 호출하면 어떻게 될까요? StopIteration 오류가 발생합니다.
next(shopping_list_enum) # --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-16-4220f68f6c7e> in <module>() ----> 1 next(shopping_list_enum) StopIteration:
enumerate() 함수는 필요할 때만 연속적인 인덱스와 요소를 반환하며, 미리 계산하지 않습니다. 메모리 효율성을 고려해야 하는 파이썬 프로젝트에서 큰 반복 가능한 객체를 다룰 때 enumerate() 함수를 사용하는 것이 유용합니다.
파이썬 enumerate() 함수 예제
이제 enumerate() 함수를 사용하는 방법을 배웠으므로, 이전에 사용했던 for 반복문을 수정해 보겠습니다.
앞선 섹션에서, enumerate 객체를 반복하면 인덱스와 요소를 포함하는 튜플이 반환된다는 것을 알았습니다. 이 튜플을 index와 item의 두 변수로 분해할 수 있습니다.
for index, item in enumerate(shopping_list):
print(f"index:{index}, item:{item}")
# 결과
index:0, item:fruits
index:1, item:cookies
index:2, item:cereals
index:3, item:protein bars
index:4, item:post-it notes
다음으로 사용자 정의 시작 값을 지정하는 방법을 살펴보겠습니다.
사용자 정의 시작 값으로 enumerate() 함수 활용법
파이썬은 0부터 인덱싱을 시작하므로, 기본적으로 시작 값은 0입니다. 하지만 사람이 읽기 쉬운 형태의 인덱스가 필요할 때(예: 1 또는 다른 값부터 시작하는 경우), 사용자 정의 시작 값을 지정할 수 있습니다.
shopping_list 예시에서 1부터 시작하려면 start = 1로 설정합니다.
for index, item in enumerate(shopping_list,1):
print(f"index:{index}, item:{item}")
# 결과
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes
주의해야 할 점은 사용자 정의 시작 값을 지정할 때 두 번째 위치 인수로 지정해야 한다는 것입니다.
반복 가능한 객체와 시작 값을 실수로 바꾸면, 아래 코드처럼 오류가 발생합니다.
for index, item in enumerate(1,shopping_list):
print(f"index:{index}, item:{item}")
# 결과
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-5dbf7e2749aa> in <module>()
----> 1 for index, item in enumerate(1,shopping_list):
2 print(f"index:{index}, item:{item}")
TypeError: 'list' object cannot be interpreted as an integer
이러한 오류를 방지하려면, 다음과 같이 키워드 인수로 start를 지정할 수 있습니다.
for index, item in enumerate(shopping_list, start = 1):
print(f"index:{index}, item:{item}")
# 결과
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes
지금까지 파이썬 리스트와 함께 enumerate() 함수를 사용하는 방법을 배웠습니다. enumerate() 함수는 파이썬 문자열, 딕셔너리, 튜플을 반복하는 데에도 사용할 수 있습니다.
파이썬 튜플에서 enumerate() 함수 활용법
shopping_list가 튜플이라고 가정해 보겠습니다. 파이썬에서 튜플은 리스트와 유사하지만, 변경 불가능한(immutable) 컬렉션입니다. 따라서 튜플은 수정할 수 없으며, 수정하려고 하면 오류가 발생합니다.
다음 코드는 shopping_list를 튜플로 초기화합니다.
shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
type(shopping_list)
# Tuple
튜플의 첫 번째 요소를 수정하려고 하면, 파이썬 튜플은 변경 불가능한 컬렉션이므로 오류가 발생합니다.
shopping_list[0] = 'vegetables' # 결과 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-2-ffdafa961600> in <module>() ----> 1 shopping_list[0] = 'vegetables' TypeError: 'tuple' object does not support item assignment
이제 다음 코드를 실행하여 튜플에서 enumerate() 함수가 예상대로 작동하는지 확인해 보겠습니다.
shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
for index, item in enumerate(shopping_list):
print(f"index:{index}, item:{item}")
파이썬 문자열에서 enumerate() 함수 활용법
파이썬 enumerate() 함수를 사용하여 문자열을 반복하고 문자와 인덱스에 동시에 접근할 수도 있습니다.
다음은 예시입니다.
py_str="Butterfly"
for index, char in enumerate(py_str):
print(f"index {index}: {char}")
# 결과
index 0: B
index 1: u
index 2: t
index 3: t
index 4: e
index 5: r
index 6: f
index 7: l
index 8: y
위 결과에서 문자들과 해당 인덱스(0-8)가 출력되었음을 확인할 수 있습니다.
결론
이번 가이드를 통해 학습한 내용을 정리하면 다음과 같습니다.
for반복문을 사용하여 각 요소에 접근하고, 별도의 카운터 또는 인덱스 변수를 사용할 수 있습니다.- 필요에 따라
range()함수를 사용하여 유효한 인덱스를 얻고, 해당 인덱스로 리스트에 접근하여 각 요소를 가져올 수 있습니다. - 권장되는 파이썬 방식은
enumerate(iterable)구문과 함께 파이썬의enumerate()함수를 사용하는 것입니다. 기본적으로 카운트 또는 인덱스는 0부터 시작합니다. enumerate(iterable, start)구문을 사용하여 사용자 정의 시작 값을 지정함으로써 원하는 시작 값부터 시작하는 인덱스와 해당 요소를 얻을 수 있습니다.- 튜플, 문자열, 딕셔너리 및 일반적으로 모든 파이썬 반복 가능한 객체에
enumerate()함수를 적용할 수 있습니다.
enumerate() 함수에 대한 이 가이드가 유익했기를 바랍니다. 다음으로 파이썬 리스트에서 요소의 인덱스를 찾는 방법을 알아보겠습니다. 계속 코딩하세요!