본문 바로가기
Python

파이썬 enumerate() 함수의 개념과 활용!

by 산코디 2024. 5. 16.

파에썬의 enumerate() 함수는 내장함수이며, 주어진 배열 객체의 값을 인덱스와 함께 반환해 주는 기능을 한다. 반복문에서 굉장히 많이 사용되는 함수로써, 해당 함수에 대한 개념과 활용 사례를 알아보고 정리해 보도록 하자.





enumerate() 함수의 개념

enumerate() 함수는 파이썬의 내장 함수로 반복 가능한 객체(리스트, 튜플, 문자열 등)를 받아 각 요소의 인덱스와 값을 순회 가능한 객체로 반환한다. 이 함수는 반복문에서 현재 요소의 인덱스를 추적하고 싶을 때 유용하게 사용된다.

enumerate() 함수는 기본적으로 0부터 시작하는 인덱스와 값을 튜플 형태로 반환한다.

arr = ['banana', 'apple', 'orange']

위와 같이 배열 값을 기준으로 enumerate() 함수를 사용한다면,

arr = ['banana', 'apple', 'orange']

enumerate(arr)
// [(0, 'apple'), (1, 'banana'), (2, 'orange')]

위와 같이 각 요소별로 인덱스 값과 함께 튜플 형태로 반환된다.

함수의 특징

인덱스 반환
enumerate() 함수는 반복 가능한 객체의 각 요소를 인덱스와 값의 쌍으로 반환하며, 이를 통해 반복문에서 요소의 인덱스를 추적하면서 값에 접근할 수 있다.

순환 객체
enumerate() 함수는 순회 가능한 객체를 반환하므로, 이를 반복문에서 사용할 수 있다. 반환된 객체는 각 요소의 인덱스와 값을 포함하는 튜플로 구성된다.

시작 인덱스 지정
기본적으로 enumerate() 함수는 0부터 시작하는 인덱스를 사용하지만, 두 번째 매개변수로 start를 지정하여 시작 인덱스를 설정할 수 있다.

메모리 효율성
enumerate() 함수는 기존의 반복 가능한 객체를 변경하지 않고 인덱스와 값을 함께 반환하기 때문에, 메모리를 효율적으로 사용한다. 즉, 원본 객체를 복사하여 새로운 객체를 생성하는 것이 아니라, 원본 객체의 요소를 참조하여 반환한다.


이렇게 enumerate() 함수의 개념과 간단한 특징들을 살펴보았다. 해당 요소의 인덱스 값을 포함하여 튜플로 반환한다는 것과, 시작 인덱스를 설정할 수 있고, 메모리 효율성이 좋다는 것을 알 수 있었다.
그렇다면 이와 같은 특징들을 통해 어떤 상황에 활용이 가능한지 정리해보자.




enumerate() 함수의 활용

enumerate() 함수는 여러 가지 다양한 상황에 활용될 수 있다. 반복문 처리, 조건 필터링, 딕셔너리 생성, 값 업데이트 등과 같이 활용될 수 있으며, 하나씩 정리하면서 자세히 알아보자.


반복문
리스트나 튜플과 같은 순회 가능한 객체의 요소에 접근할 때 인덱스와 값을 함께 사용해야 할 때 enumerate() 함수를 사용할 수 있다.

fruits = ['apple', 'banana', 'orange']
for index, fruit in enumerate(fruits):
    print(f"Index: {index}, Fruit: {fruit}")

위의 코드와 같이 fruits이라는 배열 객체를 기준으로 enumerate() 함수를 사용할 때, for in문을 통해서 순회 처리를 하는 예시 코드다. for in 문에서 반환된 튜플 객체를 index와 같이 추출하여 사용이 가능하다.


조건 필터링
특정 조건을 만족하는 요소의 인덱스를 찾을 때에도 활용이 가능하다.

numbers = [10, 20, 30, 40, 50]
for index, num in enumerate(numbers):
    if num % 20 == 0:
        print(f"Index of {num}: {index}")

위의 코드처럼 숫자 배열을 기준으로 enumerate()를 사용하고 순회할 때, 특정 조건에 부합하는 값의 인덱스만 프린트로 출력할 수 있다.


딕셔너리 생성
리스트나 튜플의 요소를 딕셔너리로 변환할 때 인덱스를 키(key)로 사용하고 값(value)은 오소로 사용하여 딕셔너리를 생성할 수 있다.

fruits = ['apple', 'banana', 'cherry']
fruit_dict = {index: fruit for index, fruit in enumerate(fruits)}
print(fruit_dict)

위와 같이 배열 객체를 기준으로 순회할 때 enumerate()를 사용하여 인덱스값을 추출하고, 해당 요소의 인덱스와 값을 기준으로 딕셔너리를 생성할 수 있다. 이때, 위와 같이 컴프리헨션 방식을 샤용한다면 간결하고 효율적이게 코드를 작성할 수 있다.


값 업데이트
리스트의 요소를 순회하면서 인덱스를 사용하여 요소를 업데이트할 수 있다.

numbers = [10, 20, 30, 40, 50]
for index, num in enumerate(numbers):
    numbers[index] = num * 2
print(numbers)

위와 같이 숫자로 구성된 배열이 있고, 해당 배열을 기준으로 순회할 때 각 요소의 인덱스 값을 이용해 해당 요소에 접근하여 값을 변경하는 코드다.
위와 같이 활용한다면 손쉽게 객체의 값을 조작할 수 있다.


위의 정리한 바와 같이 enumerate() 함수를 사용하여 간단하게 활용하는 방법을 정리해 보았다. 주로 반복문에서 사용되기 때문에 활용도가 매우 높고, 유사한 함수로 range() 함수와 함께 적절히 사용하면 좋을 것 같다.




enumerate() 함수의 성능

enumerate() 함수는 보통 반복 처리할 때 많이 사용되는데, 그러한 만큼 함수를 사용할 때 메모리를 너무 많이 서용하진 않는지, 복잡한 시간 복잡도를 가지는 것은 아닌지 객체 대상에 따라 문제가 되지는 않는지 등 한 번씩 확인해 보고 사용하는 것이 좋다.


메모리
앞서 설명한 바와 같이 enumerate() 함수는 원본 순회 가능한 객체의 요소를 참조하여 인덱스와 값을 반환하기 때문에 추가적인 메모리를 사용하지 않는다. 그렇기 때문에 메모리 사용 측면에서 매우 효율적이라고 볼 수 있다.

시간 복잡도
enumerate() 함수는 입력받은 객체의 길이에 비례하는 시간 복잡도를 가지게 된다. 즉, 시간 복잡도는 O(n)이며, 이는 인덱스와 값을 함께 반환하기 위해 한 번의 순회만 수행하면 되기 때문에 선형 시간에 처리된다.

순회 가능 객체
enumerate() 함수는 순회 가능한 모든 객체에 사용할 수 있다. 리스트, 튜플, 문자열 등이 이에 해당되며, 일반적으로는 성능에 큰 이슈기 없다.


최종적으로 정리하면, enumerate() 함수는 메모리 사용에 효율적이며, 시간 복잡도는 선형 시간에 처리가 되고, 순회 가능한 객체라면 함수를 사용하는 데 큰 문제없이 처리할 수 있다.




마무리

파이썬의 enumerate() 함수에 대해서 정리해 보았는데, 이 함수는 보통 반복문에서 주로 사용하기 때문에 사용 빈도가 굉장히 높은 편이다. 반복문을 사용할 때에는 항상 메모리와 코드 성능에 대해서 고려하는 습관이 중요한데, 이 함수 역시 성능에 대해서 정리해 보길 잘했다고 생각한다. 너무 당연하게 사용해 왔지만, 이렇게 자세히 정리하고 난 후에는 함수를 조금 더 신뢰하고 사용할 수 있는 것 같다.



* 경제지표 시각화 서비스
https://econoflow.co.kr

 

Economy Flow

 

econoflow.co.kr

 

반응형