파이썬의 itertools 모듈은 반복(iteration) 작업을 효율적으로 처리할 수 있게 해주는 강력한 도구들을 제공합니다. 이번 글에서는 파이썬 3.x 버전에서 자주 사용되는 네 가지 반복자 함수인 accumulate(), chain(), filterfalse(), dropwhile()의 개념과 사용법을 예제와 함께 자세히 알아보겠습니다.
accumulate()와 chain() 함수
accumulate() 함수는 두 개의 인자를 받습니다. 첫 번째는 연산을 적용할 반복 가능한 객체(iterable)이고, 두 번째는 수행할 함수 또는 연산입니다. 두 번째 인자를 생략하면 기본값으로 덧셈 연산이 적용됩니다. 이 함수는 각 단계마다 누적된 결과를 순서대로 반환하므로, 중간 결과값을 확인할 때 유용합니다.
chain() 함수는 여러 개의 iterable을 하나로 이어 붙여, 모든 요소를 순차적으로 출력합니다. 여러 리스트나 튜플을 하나의 흐름으로 처리하고 싶을 때 매우 편리합니다.
아래 예제를 통해 실제 구현 방법을 살펴보겠습니다.
예제 코드
import itertools
import operator as op
# 리스트 초기화
li1 = ['t','u','t','o','r']
li2 = [1,1,1,1,1]
li3 = ['i','a','l','s','p','o','i','n','t']
# accumulate() - 덧셈 연산 적용
print("각 반복 후의 합계 : ", end="")
print(list(itertools.accumulate(li1, op.add)))
# accumulate() - 곱셈 연산 적용
print("각 반복 후의 곱 : ", end="")
print(list(itertools.accumulate(li2, op.mul)))
# chain() 메서드 사용
print("연결된 모든 값 : ", end="")
print(list(itertools.chain(li1, li3)))
실행 결과
각 반복 후의 합계 : ['t', 'tu', 'tut', 'tuto', 'tutor'] 각 반복 후의 곱 : [1, 1, 1, 1, 1] 연결된 모든 값 : ['t', 'u', 't', 'o', 'r', 'i', 'a', 'l', 's', 'p', 'o', 'i', 'n', 't']
실행 결과에서 볼 수 있듯이, 문자열 리스트에 op.add를 적용하면 각 반복마다 문자가 하나씩 이어져 누적된 문자열이 생성됩니다. 곱셈 연산의 경우 모든 값이 1이므로 결과도 항상 1입니다.
dropwhile()과 filterfalse() 함수
dropwhile() 함수는 조건을 검사하는 함수와 입력 iterable을 인자로 받습니다. 이 함수는 조건이 참인 동안에는 요소를 건너뛰고(drop), 조건이 처음으로 거짓이 되는 시점부터 나머지 모든 값을 반환합니다.
filterfalse() 함수 역시 조건 검사 함수와 입력 iterable을 인자로 받습니다. 하지만 일반적인 filter와 달리, 조건이 거짓인 요소들만 걸러내어 반환한다는 점이 특징입니다.
두 함수의 차이점을 다음 예제로 확인해 보겠습니다.
예제 코드
import itertools
# 리스트
l = ['t','u','t','o','r']
# dropwhile() 메서드 사용
print("조건이 거짓이 된 이후의 값 : ", end="")
print(list(itertools.dropwhile(lambda x : x != 'o', l)))
# filterfalse() 메서드 사용
print("조건이 거짓인 값들 : ", end="")
print(list(itertools.filterfalse(lambda x : x != 'o', l)))
실행 결과
조건이 거짓이 된 이후의 값 : ['o', 'r'] 조건이 거짓인 값들 : ['o']
dropwhile()은 'o'가 처음 등장하기 전까지의 요소('t', 'u', 't')를 모두 버리고, 그 이후의 모든 값('o', 'r')을 반환합니다. 반면 filterfalse()는 전체 리스트에서 조건(x != 'o')이 거짓이 되는 요소, 즉 'o'만 반환합니다.
마무리
이번 글에서는 파이썬 3.x에서 사용할 수 있는 itertools 모듈의 대표적인 반복자 함수 네 가지를 살펴보았습니다. accumulate()는 누적 연산에, chain()은 여러 iterable의 연결에, dropwhile()과 filterfalse()는 조건 기반 필터링에 활용할 수 있습니다. 이러한 함수들을 잘 활용하면 코드를 더 간결하고 효율적으로 작성할 수 있으니, 실제 프로젝트에서 다양하게 응용해 보시기 바랍니다.