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})
본 블로그는 [파이썬 코딩의 기술] 서적을 참고하여 작성하였습니다.
반응형
'SW ENGINEERING > Python' 카테고리의 다른 글
파이썬 코딩의 기술TIP 10일차 (0) | 2021.06.18 |
---|---|
파이썬 코딩의 기술TIP 9일차 (0) | 2021.06.14 |
파이썬 코딩의 기술TIP 7일차 (0) | 2021.06.12 |
파이썬 코딩의 기술TIP 6일차 (0) | 2021.06.08 |
파이썬 코딩의 기술TIP 5일차 (0) | 2021.06.07 |
최근댓글