- [BW 8] 여러 이터레이터에 대해 나란히 루프를 수행하려면 zip을 사용하라2024년 10월 22일
- 31514
- 작성자
- 2024.10.22.:06
문제 : 가장 긴 이름을 가진 동물을 찾아라.
초기 세팅 코드
longest_name = None maxi = 0 animals = ['outer', 'hamster', 'dog'] counts = [len(n) for n in animals]
배열 인덱스 i를 사용한 코드
# 인덱스 i를 두 번 참조하여 시각적으로 잡음이 많다. for i in range(len(animals)): count = counts[i] if maxi < count: longest_name = animals[i] maxi = count print(longest_name) >>> hamster
zip을 사용한 코드
for name, count in zip(animals, counts): if count > maxi: longest_name = name maxi = count print(longest_name) >>> hamster
- zip은 둘 이상의 이터레이터를 지연 계산 제네레이터를 사용해 묶어준다.
- zip은 자신이 감싼 이터레이터 원소를 하나씩 소비한다.
- 따라서 메모리를 다 소모해서 프로그램이 중단되는 위험 없이 아주 긴 입력도 처리할 수 있다.
이터레이터의 길이가 서로 다를 때
# 원래대로라면 elephant가 나와야 하는데 hamster가 나온다. ## 그 이유는 elephant의 길이 리스트를 갱신하지 않았기 때문이다. animals.append('elephant') for name, count in zip(animals, counts): if count > maxi: longest_name = name maxi = count print(longest_name) >>> hamster
- zip은 자신이 감싼 이터레이터 중 어느 하나가 끝날 때까지 튜플을 반환한다.
- 따라서 출력은 가장 짧은 입력 이터레이터의 길이와 같다.
길이가 다르더라도 모두 조회해야 할 때
import itertools for name, count in itertools.zip_longest(animals, counts, fillvalue=None): print(f'{name}: {count}') >>> outer: 5 hamster: 7 dog: 3 elephant: None
- fillvalue 파라미터의 디폴트 값은 None 이지, 원하는 값을 지정할 수 있다.
'Book > 파이썬 코딩의 기술' 카테고리의 다른 글
[BW 10] 대입식을 사용해 반복을 피하라 (0) 2024.10.22 [BW 9] for나 while 루프 뒤에 else 블록을 사용하지 말라 (0) 2024.10.22 [BW 7] range보다는 enumerate를 사용하라 (3) 2024.10.22 [BW 6] 인덱스를 사용하는 대신 대입을 사용해 데이터를 언패킹하라 (0) 2024.10.22 [BW 5] 복잡한 식을 쓰는 대신 도우미 함수를 작성하라 (0) 2024.10.22 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)