늒네 기록

[python] enumerate()함수에 대하여 본문

언어 공부 기록/python

[python] enumerate()함수에 대하여

jaeha lee 2020. 9. 26. 22:24

파이썬에서 리스트 안에 있는 값들로 작업을 할때 다음과 같은 두 가지 접근 방법이 있을 것이다.

1
2
3
4
5
6
7
8
9
10
= ['x''y''z']
 
# list에 인덱스로 접근
for i in range(len(l)):
    print(l[i])
 
# list 아이템에 직접 접근
for s in l:
    print(s)
 
cs

하나는 인덱스로 접근하는 방법, 하나는 아이템에 직접 접근하는 방법. 첫 번째 방법은 내가 몇 번째 인덱스 가지고 작업하고 있는지를 기준으로 생각하기 쉬운 반면, 리스트가 들고있는 아이템 자체로 코드를 짠다는 생각을 하기 어렵다. 예를 들어, 아래와 같은 코드가 있다고 하면,

1
2
3
4
5
6
7
8
9
10
group = ['John''Kay''Sam']
 
# list에 인덱스로 접근
for i in range(len(group)):
    print(group[i])
 
# list 아이템에 직접 접근
for student in group:
    print(student)
 
cs

아이템에 직접 접근하는 방식이 코드도 더 짧고 의미 전달도 훨씬 잘 된다는 걸 알 수 있다.

 

다만 이때, 아이템에 직접 접근하는 방식으로는 해당 아이템이 몇 번째 인덱스에 해당하는 건지 알기 힘들다는 큰 단점이 있다. 예를 들어, 위에 있는 group 예시를 다음과 같이 확장해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
team = [
    ['John''Kay''Sam'],
    ['Jaeha''Jaeho''Jaehoon'],
    ['Foo''Bar''Baz']
]
 
# list에 인덱스로 접근
for i in range(len(team)):
    print(f'group {i+1}: {team[i]}')
 
# list 아이템에 직접 접근
for group in team:
    print(f'group ...?: {group}')
cs

team 리스트는 팀 번호 순서대로 팀을 들고있다고 해보자. 그렇다면, 두 번째 방법으로는 팀 안에 있는 그룹들에 각각 접근하는 건 어렵지 않지만, 각 그룹이 몇 번째 그룹인지 알 방법이 없다. 특정 그룹이 몇 번째 인덱스에 해당하는지 알 수 있기만 하다면 딱 좋을텐데.

 

이때 유용한 함수가 바로 enumerate 함수다. 이 함수는 인자를 두개 받는데, 첫번째는 iterable한 값, 두번째는 시작할 인덱스 값. 참고로 시작할 인덱스 값을 넘겨주지 않으면 자동으로 0부터 시작한다. 이 함수가 해주는 역할은, 인덱스와 iterable한 값(예를 들어 list)에 있는 아이템의 쌍을 순서대로 넘겨준다. 예를 들어, 이런 식이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
team = [
    ['John''Kay''Sam'],
    ['Jaeha''Jaeho''Jaehoon'],
    ['Foo''Bar''Baz']
]
 
# enumerate
for ind, group in enumerate(team,1):
    print(f'group {ind}: {group}')
 
#group 1: ['John', 'Kay', 'Sam']
#group 2: ['Jaeha', 'Jaeho', 'Jaehoon']
#group 3: ['Foo', 'Bar', 'Baz']
cs

enumerate 함수에 team과 시작할 인덱스 1을 넣어주면, 알아서 team 리스트 내에 있는 아이템에 순서대로 인덱스를 붙여서 넘겨준다. 위의 코드에서 눈치 챘을지 모르겠지만, 리스트에 인덱스로 접근하는 방법을 썼을 때 실제 리스트 인덱스가 0부터 시작하는 바람에 group 번호를 붙일때 i+1을 사용했는데 enumerate의 시작 인덱스를 활용하면 훨씬 보기 깔끔하게 코드가 정리된다.

 

이것저것 검색해보면서 스택 오버플로우를 돌아다니다 보면 enumerate를 쓰는 것이 파이써닉한 코드를 짤 때 국룰인것 같기도 하다.

반응형
Comments