반응형
오늘은 여러 리스트나 이터레이터를 동시에 다룰 때 인덱스로 접근하지 말고
왜 zip을 써야 하는가에 대한 본질적인 이유와 주의점을 공부해 보자.
일단 우리가 익숙한 인덱스 접근의 문제점을 살펴보도록 하자.
names = ['김도훈', '김석범생이', '유동남서북치고장구치고']
counts = [len(n) for n in names]
longest_name = None
max_count = 0
for i, name in enumerate(names):
count = counts[i]
if count > max_count:
longest_name = name
max_count = count
가장 긴 이름을 가진 단어와 그 길이를 구하는 코드이다.
물론 지금도 원하는 기능을 수행하지만, 코드가 뭔가 좀 지저분하다는 느낌을 지울 수가 없다.(책 말로는 그렇다고 한다)
그렇다면 같은 기능을 하는 코드를 좀 더 pythonic 하게 작성해보도록 하자. -> zip을 사용한다
names = ['김도훈', '김석범생이', '유동남서북치고장구치고']
counts = [len(n) for n in names]
longest_name = None
max_count = 0
for name, count in zip(names, counts):
if count > max_count:
longest_name = name
max_count = count
솔직히 한 줄 차이라 큰 차이가 없어보이긴 하지만 그래도 가독성이 좋아졌다.
참조해야 할 배열이 두 개 이상(세개, 네 개도 가능하다)이라면 for 문 안에서 직접 튜플을 언패킹 할 수 있어
코드도 깔끔해지고, 메모리 효율성도 좋다(이터레이터에서 한 번에 한 항목씩 가져오는 지연 방식으로 동작하기 때문).
하지만 주의해야 할 점도 있다 : "조용한 잘림(Silent Truncation) 현상"
만약 묶어주는 이터레이터들의 길이가 서로 다르면 오류 없이 조용하게 출력이 되지 않는 일이 생길 수 있다.
names.append('김수호랑이빨')
for name, count in zip(names, counts):
print(name)
# 출력:
# 김도훈
# 김석범생이
# 유동남서북치고장구치고
이러한 잘림 현상을 미연에 방지하고 싶다면,
zip(names, counts, strict = True)를 통해 ValueError를 발생시킬 수 있다.
오늘은 여러 리스트나 이터레이터를 동시에 다룰 때 유용한 zip에 대해 알아보았다!
반응형
'EffectivePython_125' 카테고리의 다른 글
| [20] Never Use for Loop Variables After the Loop Ends (2) | 2026.03.20 |
|---|---|
| [19] Avoid else Blocks After for and while Loops (3) | 2026.03.19 |
| [17] Prefer enumerate over range (3) | 2026.03.17 |
| [16] Prefer Catch-All Unpacking over Slicing (2) | 2026.03.11 |
| [15] Avoid Striding and Slicing in a Single Expression (3) | 2026.03.10 |