"IT인들, 국가대표 출신 도움 받아 마라톤 풀코스 도전"

Python enumerate 사용법: 사용 예시부터 활용 방법까지 총정리

프리랜서의 모든 것

비즈니스 팁, 21 Aug 2024

python


Python에서 리스트, 딕셔너리, 튜플 등 순서가 있는 자료구조를 활용할 때 전체 데이터 조회를 위한 반복처리를 수행하거나, 정렬된 데이터를 순서 맞춰 활용하기 위해 데이터를 순차적으로 조회하는 경우가 빈번하게 발생합니다. 


이럴 때 순서를 관리하기 위해 변수를 선언하고 값을 관리하다 보면 인덱스 변수의 변경이 지속적으로 발생하고 이러한 변경 작업 과정에서의 실수로 인해 버그가 발생하기도 합니다. 


이럴 때 Python ‘enumerate 함수’를 사용하면 불필요한 변수 관리를 없애고 인덱스와 데이터를 함께 활용해 코드 가독성을 향상시키는 효과를 얻을 수 있는데요.

 

Python에서 시퀀스 데이터를 활용할 때 간결하고 명확한 코드 작성을 돕고 불필요한 코딩 실수를 줄이는 데 도움을 주는 ‘Python enumerate 내장함수’에 대해 이랜서에서 자세히 알려드리겠습니다.



* 문자열 검색시 한 번 알아두번 톡톡히 써먹는 정규 표현식 

▶️ 정규 표현식; 자바 정규식을 활용해서 문자열을 손쉽게 처리하는 방법 보러가기



Python enumerate란?


python-enumerate


Python의 ‘enumerate 함수’는 시퀀스(리스트, 튜플 등)를 순회할 때 인덱스와 값을 함께 반환하는 유용한 내장함수입니다. 이는 For loop를 통해 데이터를 처리하면서 인덱스가 필요할 경우 매우 편리합니다.


대부분의 프로그래밍 언어에서 배열이나 리스트와 같은 자료구조를 활용할 때 인덱스(Index) 변수를 증가 또는 감소시키면서 For loop를 수행하는 게 일반적이며 Python에서는 아래와 같이 range 함수를 이용하여 범위 내 숫자를 생성하여 Loop를 수행하게 됩니다.



l = [ 1, 2, 3 ]

for i in range(0, len(l)):

   print(l[i], end=" ") # 1 2 3

print("")


range를 활용한 데이터 활용도 가능하지만 Python에서 제공하는 enumerate 내장함수를 활용하면 자료구조의 인덱스와 데이터를 더 직관적이고 편리하게 활용이 가능한데요, enumerate의 사용 방법과 활용 사례를 알아보고 일반적인 for loop와 비교했을 때 어떤 장점이 있는지 알려 드리겠습니다.



Python enumerate 사용방법


python-enumerate-class


Python enumerate는 Iterable 값을 받아서 시퀀스의 현재 인덱스(카운트)와 시퀀스의 현재 값(Iterator를 이터레이션 하여 얻어지는 값)을 반환하는 내장 함수입니다. enumerate 함수를 사용하는 방법은 아래와 같습니다.



=enumerate(iterable, start=0)


enumerate 함수에 첫 번째 인자로 전달되는 Iterable 객체는 반복 가능한 객체를 의미하며 대표적인 Iterable 타입으로는 list, dict, set, str, bytes, tuple, range 등이 있는데요.


Iterable 객체를 받아 수행된 enumerate 함수는 데이터에 인덱스를 할당해 enumerate 객체를 리턴합니다. 함수 수행의 결과로 리턴된 enumerate 객체를 어떻게 효과적으로 활용 가능한지 알아보겠습니다.



For loop 을 이용한 기본 활용


기본적으로 enumerate 객체는 반복문에서 인덱스와 값을 동시에 처리하기 위해 사용됩니다.  예를 들어, list 의 각 요소와 그 인덱스를 출력하려면 다음과 같이 할 수 있습니다. 



alphabet = ['a', 'b', 'c', 'd']


for index, value in enumerate(alphabet):

   print(index, value)


# 출력

# 0 a

# 1 b

# 2 c

# 3 d

(for loop과  enumerate 를 함께 사용한 코드)



enumerate 함수를 사용하지 않는다면 어떻게 코드가 작성되었을까요? 아마 별도의 인덱스 변수를 선언하고 for loop 안에서 인덱스 변수 관리가 필요했을 것입니다. 


아래 코드를 비교해 보시면 enumerate를 활용한 코드가 더 간결하고 가독성이 좋다는 것을 알 수 있습니다.



alphabet = ['a', 'b', 'c', 'd']


idx = 0  # index 변수 선언

for value in alphabet:

   print(idx, value)

   idx += 1 # idx 1만큼 증가

(enumerate 함수를 사용한 코드)



앞에서 3줄로 작성되었던 코드가 인덱스 변수를 사용한 for loop에서는 5줄로 늘어났습니다. 예시에서의 2줄이 큰 차이 없다고 느껴지실 수 있지만 증가율로 따지면 기존 코드의 65%가 넘는 코드가 추가로 더 필요해진 것이며 이런 코드가 반복된다면 그만큼 코드 길이는 길어지고 가독성이 좋지 않아질 것입니다. 


그뿐만 아니라 인덱스 변수를 반복적으로 선언하고 사용하다가 잘못된 값을 할당하는 실수를 범하게 된다면 코드를 디버깅하는 데 여러분의 소중한 시간을 쓰게 될지도 모릅니다.


enumerate를 사용하지 않고도 코드를 간결하게 작성하시는 개발자분들도 계실 것입니다. 아래는 enumerate 사용 예시와 동일한 수준으로 코드를 줄인 예시입니다.



alphabet = ['a', 'b', 'c', 'd']


for idx in range(len(alphabet)):

   print( idx, alphabet[idx])

(enumerate를 사용하지 않고 코드를 간결하게 작성한 예시)



코드 라인이 enumerate 사용 사례와 동일하다고 하더라도 enumerate의 장점은 여전히 존재하는데요. 인덱스로 리스트에 직접 접근하는 경우에 코드에서 인덱스를 잘못 입력하는 경우 인덱스 순서에 맞지 않는 데이터를 리스트에서 가져오는 문제가 발생할 수 있습니다. 


enumerate는 이런 코드 실수를 방지할 수 있다는 점에서 secure coding에도 도움을 주는 내장함수입니다.



인덱스 시작 값의 변경


enumerate 함수를 통해 생성된 enumerate 객체의 인덱스는 0부터 시작합니다. 하지만 개발자는 enumerate 함수 실행 시 인덱스 시작 값을 설정함으로써 인덱스를 원하는 값부터 지정하여 시작할 수 있습니다.



for index, value in enumerate(alphabet, start=1):

   print(index, value)

# 출력

# 1 a

# 2 b

# 3 c

# 4 d


거의 모든 프로그래밍 언어에서 시퀀스 데이터들의 인덱스는 0부터 시작하기 때문에 개발자들은 0으로 시작하는 인덱스의 활용이 자연스럽습니다. 


하지만 대부분의 사람들은 1부터 시작하는 순서에 익숙하기 때문에 데이터 출력 시 시작을 1로 출력해야 하는 경우가 많으며 이럴 때 인덱스 시작 값 설정을 활용하면 쉽게 구현이 가능합니다.


예를 들어 전자 책 프로그램을 만들어야 한다고 생각해 보겠습니다. 책을 열었을 때 내용이 Chapter 0부터 시작한다면 보통 사람들은 이상하다고 생각할 텐데요, 인덱스 시작을 1로 설정함으로써 Chapter 1부터 출력되는 결과를 확인할 수 있습니다. 


아래처럼 책의 단락과 내용을 출력할 때 Chapter 1부터 시작하면 사용자가 이질감을 느끼지 않을 것입니다.



# 챕터별 주제

boook_chapters = [ "About me.", "About my parents.", "About my friends." ]


for line_number, log in enumerate(boook_chapters, start=1):

   print(f"Chapter {line_number}: {log}")

# Chapter 1: About me.

# Chapter 2: About my parents.

# Chapter 3: About my friends.



Comprehension을 활용한 enumerate 자료형 변환


인덱스와 데이터를 활용이 필요할 때마다 매번 enumerate와 for loop를 호출하는 경우 For loop 와 enumerate 함수가 반복적으로 사용됩니다. 


이런 경우 프로그램의 성능을 저하시킬 뿐만 아니라 코드가 길어져 가독성을 떨어뜨릴 수 있는데요, 이럴 때 Comprehension 기능을 활용하여 인덱스를 포함한 별도의 자료구조를 만들어 두고 사용하면 중복되는 코드를 줄일 수 있을 것입니다.


Python은 가독성 높은 간결한 코드 작성을 위해 Comprehension 기능을 제공합니다. 이는 파이썬 고유의 문법으로 자료구조 데이터를 표현할 때 유용하게 사용이 가능합니다. 


런타임에 변경이 발생하는 데이터가 아니라면 enumerate 결과를 list, dictionary, set 자료형으로 변환하여 사용해 보세요. 반복적인 코드를 줄임으로써 효율적인 코드 작성이 가능해질 것입니다.


아래는 Comprehension을 이용하여 index와 값을 하나의 쌍으로 리스트를 생성하는 예시입니다.  list, dict, set으로 enumerate 결과를 변환 함으로써  enumerate 호출 없이 바로 활용이 가능해 지는 것을 확인하실 수 있습니다.



# enumerate to list

indexed_chars= [(index, char) for index, char in enumerate(alphabet)]

print(indexed_chars)

# 출력

# [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]


# enumerate to dict

char_dict = {index: char for index, char in enumerate(alphabet)}

print(char_dict)

# 출력

# {0: 'a', 1: 'b', 2: 'c', 3: 'd'}


# enumerate to set

char_set = { (index, char) for index, char in enumerate(alphabet)}

print(char_set)

# 출력, 순서의 개념이 없는 set에서는 결과가 섞여있는 것을 확인할 수 있습니다.

# {(2, 'c'), (1, 'b'), (3, 'd'), (0, 'a')}



Python Comprehension을 활용하여 새로운 Iterable 객체를 만들어 보세요. 단 한 줄의 코드에 For loop와 enumerate를 구현하여 코드 가독성과 작업성을 모두 높이고 이를 통해 개발 및 유지 보수를 수월하게 할 수 있습니다.



enumerate를 이용한 이벤트 로그 분석


서비스 운영을 하다 보면 이슈 해결을 위한 로그분석을 목적으로 특정 이벤트를 추출해야 하는 경우가 자주 발생합니다. 


이런 경우 로그 라인을 함께 기록해 두면 다른 개발자에게 이력을 공유하거나 해당 이벤트 전후로 발생한 로그 메시지를 확인하는데 유용한데요, 이럴 때 enumerate를 이용하면 로그 파일에서 특정 이벤트가 발생한 라인 번호를 쉽게 추출하여 기록할 수 있습니다.



logs_example = [

   "INFO: User logged in",

   "ERROR: Not authorized user",

   "INFO: Data processed",

   "ERROR: Timeout occurred",

   "INFO: Data processed",

   "INFO: Data processed",

   "ERROR: File not found",

]


for line_number, log in enumerate(logs_example, start=1):

   if "ERROR" in log:

       print(f"Error found at line {line_number}: {log}")

# 출력:

# Error found at line 2: ERROR: Not authorized user

# Error found at line 4: ERROR: Timeout occurred

# Error found at line 7: ERROR: File not found



시스템, 서비스 운영을 하는 담당자라면 로그 분석에 enumerate를 활용해 보세요. 로그 메시지와 라인 번호를 기록해 두면 특정 오류가 발생한 위치를 쉽게 찾을 수 있어 디버깅이 쉬워집니다. 


그리고 동료들과 문제점을 공유할 때에도 로그 라인을 함께 전달한다면 센스 있는 직장동료가 되실 수 있을 것입니다.



Python enumerate를 통한 간결한 코드 작성 


python-enumerate-함수


Python에서 리스트,  튜플, 딕셔너리 등 다양한 자료구조를 활용하는 경우 인덱스로 값을 조회하고 활용하기 위해 인덱스 관리가 필요한 경우가 발생합니다.


이럴 때 인덱스 변수를 사용하는 방법 대신에 enumerate를 활용해 보세요. 단순한 구문으로 인해 쉬운 사용이 가능할 뿐만 아니라 잘 활용한다면 인덱스와 값을 동시에 처리할 수 있어 코드의 가독성과 효율성을 크게 높일 수 있습니다.


이랜서에서 알려드리는 Python enumerate의 활용법을 익히고, 실제 프로젝트에서 적용해 보세요. 가독성 좋고 이해하기 쉬운 코드를 통해 개발자 실수를 방지함으로써 더 빠른 개발이 가능해질 것입니다.



이랜서 추천, 개발자의 업무 효율 상승을 도와주는 문법 활용법

▶️ [Javascript 문법] 문자열 자르기부터 복잡한 문자열 총정리!

▶️ React Query를 통한 데이터 패칭, 캐싱, 동기화 방법 총정리

▶️ 정규 표현식; 자바 정규식을 활용해서 문자열을 손쉽게 처리하는 방법


이랜서 선정, AI를 현명하게 사용하는 AI 활용 콘텐츠

▶️ 미드저니 사용법: 프롬프트 작성 가이드

▶️ 프롬프트 작성법, 'Chat GPT 엔지니어'는 이렇게 사용합니다.

▶️ 라마 3 vs Chat GPT, AI Chat 무엇이 더 좋을까?(Feat. Llama 3 사용법)





파이썬을 활용할 IT 프로젝트를 찾으시나요?

대한민국 최대 IT 인재 매칭 플랫폼 이랜서


이랜서는 IT 전문가에게 24년의 데이터를 바탕으로 최적합 프로젝트를 매칭하는 IT 인재 매칭 플랫폼입니다.


프로젝트 개발을 위한 JavaJavaScript, Typescript 개발자와 랜딩 페이지를 활용하여 고객을 사로잡을 React, Vue, PHP, jQuery 개발자, 서버 구축과 데이터를 활용을 위한 Node js, Spring, Nest jsSQL 개발자(Oracle, MySQL, MS SQL 등), 전사적 자원 관리 프로그램을 위한 ERPSAP 개발자  그리고 UI/UX 디자인을 위한 피그마, Adobe XD, 포토샵, 일러스트 디자이너파이썬 개발자를 포함하여 약 40만 명의 IT 전문 프리랜서가 이랜서를 통해 최적합 프로젝트를 매칭받고 있습니다.


python-for-enumerate




프리랜서의 역량과 성향, 이력을 잘 분석하여

꼭 필요한 프로젝트에 잘 매칭해 주십니다.”


python-enumerate-function


이랜서는 24년 동안 축척한 약 1.5억 개의 사용자 데이터350만 개의 프리랜서 평가 데이터 활용하여 IT 프리랜서의 성향과 인성에 가장 적합한 프로젝트를 매칭하여 약 40만 명의 IT 프리랜서들이 이랜서를 통해 맞춤형 프로젝트를 매칭 받고 있습니다.




매번 경력 기술서이력서 업데이트하기 불편하셨죠?

오토폴리오가 알아서 정리해 드립니다.


디자이너-포트폴리오

오토폴리오는 이랜서 독자 기술로 개발된 이력서 자동관리 서비스 프로그램 입니다. 초기 1회만 표준 양식으로 업데이트하면 경력과 이력이 자동으로 정리되고, 이랜서를 통해 수주한 프로젝트는 자동으로 업데이트되어, 워드 파일로 다운로드하거나 메일로 빠르게 공유할 수 있습니다. 




까다로운 프로젝트 수주,

24년의 데이터를 활용하여 최적합 프로젝트를 매칭해 드립니다.


python-range-vs-enmuerate

경기가 어려운 요즘 프로젝트 수주가 쉽지 않죠? 이랜서와 함께하세요. 이랜서의 상주 매니저가 IT 프리랜서를 1:1로 케어하며, 24년의 노하우와 데이터를 활용하여 IT 프리랜서에게 가장 적합한 맞춤형 프로젝트를 매칭해 드립니다.




최신 블로그