반응형
일반적으로 두개의 리스트를 병렬로 다루고 싶을 때 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
'Coding > Python' 카테고리의 다른 글
Python Method Chaining (0) | 2019.07.17 |
---|---|
ECS Blue/Green CodeDeploy 연동 배포 자동화 스크립트 (0) | 2019.06.21 |
MongoEngine과 Pymongo 같은 Connection 유지하는 방법 (0) | 2019.06.13 |
Python 일급함수/클로저/Decorator에 관해서 (0) | 2019.06.04 |
Python async/await로 비동기 프로그래밍하기 (0) | 2019.05.23 |