본문 바로가기

Program Languages/Python

파이썬 enumerate, zip 함수 사용법

파이썬의 enumerate,zip 라는 어원에서 알 수 있듯이,

  • enumerate 함수는 Iterator를 하나하나 열거(수를 세면서)하면서 각 원소들을 탐색하는 함수
  • zip함수는 여러 Iterator의 각 Iterator의 행(Row)들을  열(Column)로   min(여러 iterator 인스턴스들의 요소 갯수들) 만큼 앞쪽에서부터 탐색하는 함수

라고 할 수 있습니다.

정확한 건 아니지만 이해하기 쉽게 개념적인 그림으로 나타내보면,

enumerate함수

enumerate 함수를 사용하면 해당 '인덱스+오프셋' 값도 같이 반환함

zip함수

zip함수를 사용하지 않으면 각각 변수에 접근해야 했던 것을 같은 인덱스 번호에 해당하는 값들을 한번에 같이 반환해줌

 

 

다음은 enumerate와 zip함수의 매개변수에 관해 살펴보겠습니다.

enumerate, zip 함수의 매개변수

함수명 파라메터 명 파라메터 기본값 설명 예제
  enumerate함수
  iterable   iter()함수가 불려질 수 있는 인스턴스 enumerate([chr(i+97) for i in range(10)])
start 0 첫번째 열거되는 번호(오프셋) enumerate([chr(i+97) for i in range(10)],start=-10)
  zip함수
  *iterables   iter()함수가 불려질 수 있는 인스턴스들 zip(range(10),range(11),range(12),range(13),...)
strict False *iterables 매개변수에 여러개의 iterator들이 들어올 수 있으므로,
각각의 *iterables들이 같은 크기를 가져야 하는 지의 여부
활성화됐을때 iterables의 각각의 요소 갯수가 다르면 에러출력
zip(range(10),ranage(10),strict=True)

이면 에러안나고 정상작동,

zip(range(10),ranage(14),strict=True) 

이면 에러발생

 

기본 코드 사용 예시

#enumerate함수 예제
strings = ["string"+str(i) for i in reversed(range(-20,-10,1))]
print("strings:",strings)
print()
print("enumerate함수:")
start_number = 0
for idx,item in enumerate(strings,start=start_number):
    print(f"  열거번호:",str(idx).zfill(2)+f" {type(idx)}","  값:", item)
print()
print()




#zip함수 예제:
print("zip함수:")
ranges = [range(i*2,10+i*2) for i in range(5)]
print("  원래 ranges값들:",)
for i in range(len(ranges)):
    print(f"    ranges[{i}]=",*map(lambda x: str(x).zfill(2),ranges[i]))
print()
print("  zip함수를 통해 묶은 결과")

for packed_row in zip(  ranges[0],
                        ranges[1],
                        ranges[2],
                        ranges[3],
                        ranges[4],
                        strict=False):
    print("\t",packed_row)
print()
#아래는 위의 zip사용 코드와 거의 유사하게 동작하는 리팩터링된 코드입니다.
if(True!=True):
    #리팩터링1
    for packed_row in zip(  *ranges,strict=False):
        print("\t ",*packed_row)
    print()
    
    #리팩터링2
    for (v1,v2,v3,v4,v5) in zip(  *ranges,strict=False):
        print("\t ",v1,v2,v3,v4,v5)
    print()
    
    #리팩터링3
    for v1,v2,v3,v4,v5 in zip(  *ranges,strict=False):
        print("\t ",v1,v2,v3,v4,v5)
    print()

    #...

 

추가적인 사항

enumerate

  • start매개변수는 정수값만 허용되며, 이때  음의 정수도 가능하다.

zip

  • strict매개변수값이 True일 경우, [len(iter1),len(iter2),len(iter3),...] 이 있을때 이들의 값이 [2,2,2,...] 처럼 전부 같은 값을 가지지 않고 [1,2,2,...] 같이 어느 한개 이상의 iterator의 요소 갯수도 틀리다면 에러를 발생시킨다.
  • strict매개변수값이 False일때 [len(iter1),len(iter2),len(iter3),...] 의 값이 [1,2,3,...]처럼 서로 다를 경우, 탐색 횟수는 min([len(iter1),len(iter2),len(iter3),...])의 값을 가지며, 통합된 전체 갯수를 탐색하고 싶은 경우, 따로 구현하거나 itertools같은 라이브러리를 사용해야 한다.(itertools라이브러리는 다른 포스트에서 언급하기로 하겠습니다)