반복 자체는 이미 for로 돈다고 가정하고, 여기서는 값 옆에 무엇을 같이 붙일지 고릅니다.
번호를 붙일지, 여러 iterable을 같은 위치끼리 묶을지, 길이 차이를 오류로 볼지에 따라 enumerate, zip, zip(..., strict=True), zip_longest가 갈립니다.
숏컷 코드
# 값에 번호를 붙일 때
for index, name in enumerate(names, start=1):
print(index, name)
# 두 흐름을 나란히 읽을 때
for name, score in zip(names, scores):
print(name, score)
# 길이 차이를 오류로 보고 싶을 때
for name, score in zip(names, scores, strict=True):
print(name, score)문법
기본형은 번호 붙이기와 짝 묶기를 함께 보면 됩니다.
for index, value in enumerate(items, start=1):
...
for left, right in zip(a, b):
...반복 도구 선택
값은 그대로 두고 번호만 붙이면 enumerate
리스트를 돌면서 위치도 필요할 때 range(len(items))를 먼저 떠올리기 쉽지만,
Python에서는 enumerate()가 더 직접적입니다.
값과 번호를 한 번에 주기 때문에 "값을 읽는다"는 흐름이 깨지지 않습니다.
for index, value in enumerate(items):
print(index, value)
for line_no, line in enumerate(lines, start=1):
print(line_no, line)이 패턴은 값이 주인공이고, 번호는 부가 정보일 때 특히 읽기 좋습니다.
두 흐름을 나란히 읽으면 zip
zip()은 여러 iterable의 같은 위치 값을 묶어서 꺼냅니다.
즉 "이름과 점수", "컬럼명과 값", "좌표 x와 y"처럼 대응되는 흐름을 같이 읽을 때 가장 깔끔합니다.
names = ["Mina", "Jin"]
scores = [95, 88]
for name, score in zip(names, scores):
print(f"{name}: {score}")인덱스로 두 리스트를 동시에 접근하는 패턴보다 실수가 적고, 코드도 더 짧습니다.
길이 불일치 처리
길이 차이가 버그면 strict=True
기본 zip()은 가장 짧은 iterable 길이에 맞춰 조용히 멈춥니다.
그래서 두 데이터가 반드시 1:1 대응해야 한다면 Python 3.10+에서는 strict=True를 붙이는 편이 안전합니다.
for left, right in zip(a, b, strict=True):
print(left, right)길이 불일치를 "조용한 절단"으로 두지 않고 바로 드러낸다는 점이 핵심입니다.
길이가 달라도 끝까지 맞춰야 하면 zip_longest()
기본 zip()은 짧은 쪽에서 멈추므로, 비어 있는 칸을 채워 가며 끝까지 맞춰야 하면 itertools.zip_longest()가 맞습니다.
from itertools import zip_longest
for left, right in zip_longest(a, b, fillvalue=""):
print(left, right)CSV 병합, UI 컬럼 정렬, 길이가 다를 수 있는 비교 출력처럼 "끝까지 맞춰 보기"가 목적일 때 유용합니다.
주의할 점
zip()은 기본적으로 가장 짧은 iterable 길이에 맞춰 조용히 종료합니다. 데이터 누락을 놓치기 쉬운 지점입니다.
# ❌ 오른쪽 값 하나가 조용히 버려질 수 있다
names = ["Mina"]
scores = [95, 88]
for name, score in zip(names, scores):
print(name, score)
# ✅ 길이 불일치를 잡고 싶다면 strict=True
for name, score in zip(names, scores, strict=True):
print(name, score)# ❌ index가 필요하다고 무조건 range(len(...))부터 시작
for i in range(len(items)):
print(i, items[i])
# ✅ 값이 주인공이면 enumerate()가 더 직접적
for i, item in enumerate(items):
print(i, item)참고 링크
2 sources