본문 바로가기
Coding/Python

Python zip으로 병렬처리 시 리스트의 크기가 다른 경우

by Hide­ 2019. 6. 14.
반응형

일반적으로 두개의 리스트를 병렬로 다루고 싶을 때 zip() 메소드를 이용한다. 나같은 경우 두개의 리스트를 하나하나 루프를 돌며 비교하는 검증 작업을 진행하고 있었다. 작업 도중 한가지 문제점을 발견했는데, 바로 사이즈가 다를 때였다. zip()을 사용하여 두개의 리스트를 순회하면 사이즈가 다른 경우 사이즈가 작은 리스트의 작업까지만 순회하고 루프를 종료한다.


a = [1, 2, 3]
b = [4, 5]


for x, y in zip(a, b):
print(f'x: {x} / y: {y}')


예를 들어 위와 같이 사이즈가 다른 두개의 리스트를 zip을 통해 순회하면 결과는 다음과 같다.


x: 1 / y: 4

x: 2 / y: 5


나는 마지막 값까지 순회하며 처리하고 싶었다. 그렇다면 무언가 특정 값으로 Padding시키는 방법이 좋을 것 같았고 관련 메소드가 없나 찾아봤더니 itertools라이브러리 내에 zip_longest() 라는 메소드가 존재하였다. 


import itertools


a = [1, 2, 3]
b = [4, 5]


for x, y in list(itertools.zip_longest(a, b)):
print(f'x: {x} / y: {y}')


위와 같이 처리해주고 실행시켜보면 결과는 다음과 같다.


x: 1 / y: 4

x: 2 / y: 5

x: 3 / y: None


자동으로 None을 채워주는 형태이다. 만약 여기서 원하는 값을 채워주고 싶다면 fillvalue인자에 원하는 값을 넣어주면 된다.


import itertools


a = [1, 2, 3]
b = [4, 5]


for x, y in list(itertools.zip_longest(a, b, fillvalue='test')):
print(f'x: {x} / y: {y}')


x: 1 / y: 4

x: 2 / y: 5

x: 3 / y: test