Python에서 두 리스트를 병렬로 순회하기
두 리스트의 길이가 서로 다를 수 있다면, 공통 인덱스 범위만큼 병렬로 순회하는 방법 중 하나는 min()으로 구한 최소 길이만큼 range()를 사용해 for 루프를 도는 것입니다.
>>> L1
['a', 'b', 'c', 'd']
>>> L2
[4, 5, 6]
>>> l = len(L1) if len(L1) <= len(L2) else len(L2)
>>> l
3
>>> for i in range(l):
print (L1[i], L2[i])
a 4
b 5
c 6더 파이썬다운 방법: zip() 함수
하지만 위 방식보다 훨씬 간결하고 가독성이 좋은 방법은 zip() 함수를 사용하는 것입니다. zip()은 여러 이터러블(iterable)에서 요소들을 하나씩 묶어 튜플 형태로 반환하는 이터레이터를 생성하므로, 인덱스 계산 없이 자연스럽게 병렬 순회가 가능합니다.
>>> for i, j in zip(L1, L2):
print (i, j)
a 4
b 5
c 6zip() 사용 시 주의할 점
zip()은 가장 짧은 이터러블을 기준으로 순회를 종료합니다. 따라서 위 예제에서 L1의 네 번째 요소 'd'는 처리되지 않습니다. 만약 긴 쪽 리스트까지 모두 순회해야 한다면, Python 3.10부터 제공되는 itertools.zip_longest()를 활용할 수 있습니다.
>>> from itertools import zip_longest
>>> for i, j in zip_longest(L1, L2, fillvalue=None):
print (i, j)
a 4
b 5
c 6
d None정리
- 인덱스 기반 접근이 필요하다면 최소 길이만큼
range()로 for 루프를 작성합니다. - 일반적인 경우에는
zip()함수를 사용하는 것이 가장 파이썬다운(Pythonic) 방법입니다. - 짧은 쪽에 맞추지 않고 긴 리스트까지 모두 순회하려면
itertools.zip_longest()를 사용하세요.