8. 여러 이터레이터에 대해 나란히 루프를 수행하려면 zip을 사용해라

 

관련된 객체가 들어있는 리스트를 다루는 경우

names = ['A', 'B', 'C']
counts = [len(n) for n in names]
print(counts)

 

만들어진 list의 각 원소는 소스 list에서 같은 인덱스에 위치한 원소와 관련이 있음

두 리스트를 동시에 이터레이션을 할 경우 names 소스 리스트의 길이를 사용해 이터레이션 가능

 

longest_name = None
max_count = 0

for i in range(len(names)):
	count = counts[i]
    if count > max_count:
    	longest_nmae = names[i]
        max_count = count

위에는 연산이 두 번 발생하는 안좋은 코드

 

for i, name in enumerate(names):
	count = counts[i]
    if count > max_count:
    	longest_name = name
        max_count = count

조금 개선

 

zip은 둘 이상의 이터레이터의 값을 튜플로 반환함

for name, count iin zip(name, counts):
	if count > max_count:
    	longest_name = name
        max_count = count

zip으로 감싼 이터레이터 원소를 하나씩 소비하므로 메모리의 낭비가 없음

 

zip은 자신이 감싼 이터레이터 중 어느 하나가 끝날때까지 튜플을 내놓음

따라서 출력은 가장 짧은 입력의 길이와 같음

입력 이터레이터의 길이가 모두 같으면 가장 좋은 방식

 

하지만 길이가 다를 때는 itertools 안의 zip_longest를 사용

import itertools

for name, count in itertools.zip_longest(names, counts):
	print(f'{name} : {count})

 

본 블로그는 [파이썬 코딩의 기술] 서적을 참고하여 작성하였습니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기