본문 바로가기
Language & Tool/Python

🐍반복 처리를 위한 itertools, more_itertools

by 박수무당벌레 2025. 6. 20.

관련글 :

itertools.zip_longest https://waydd.tistory.com/31

 

 

1. 핵심 개념

 

Python의 반복 처리 능력을 확장하는 모듈

  • itertools : 반복 가능한 객체 (iterable)를 효율적으로 다루기 위한 유틸리티 함수 모음, C로 작성됨(CPython에 최적화)
    자주 사용하는 반복 연산(순열, 조합, 누적 합, 필터링 등)반복자(iterator) 기반으로 지연 평가(= 리스트 전체 저장 불필요)
    → 대용량 데이터를 다룰 때 유용
  • more_itertools : itertools의 기능을 보완, 자주 사용하는 반복 패턴(슬라이딩 윈도우, 리스트 분할, 중첩 구조 해제, iterator 제어 등)을 함수로 제공
    → 데이터 분석, 파싱, 스트리밍 처리 등에 유용
# itertools
import itertools

# more-itertools
pip install more-itertools # 설치 필요
import more_itertools

 

- 비교 요약

  itertools  (표준 라이브러리) more_itertools (외부 확장 모듈)
설치 필요 여부 기본 제공 pip install more_itertools 설치 필요
설명 반복자 기반의 고성능 함수 제공
→ 속도 빠름, 메모리 절약
itertools 기능 보완, 고급 패턴 제공
실제 사용 빠르고 가볍지만 구현은 직접 해야함
zip, map, filter와 자주 쓰임
자주 쓰는 패턴들을 함수화(내부적으로 zip, map 포함) → 해당 함수만 호출 (단일 기능 특화)

 

 

2. itertools 주요 함수

 

- 반복 생성

  설명 예시
count([start=0, step=1]) 무한 카운트 생성 (enumerate()의 확장) count(10) → 10, 11, 12, ...
cycle(iterable) 반복적으로 순환 cycle('ABC') → A, B, C, A, ...
repeat(object[, times]) 하나의 값을 n번 반복 repeat(3, 4) → 3, 3, 3, 3
starmap(function, iterable) iterable 내부의 튜플을 함수의 인자로 언팩(풀어서) 적용 (map()의 확장)  
※ cycle() 함수 작동 방식
- iterable을 무한 반복하는 반복자 생성
  → 내부에서 현재 어디까지 순회했는지 에 대한 상태(인덱스 포인터) 를 기억해야 함
- 즉, 내부적으로는 원본 iterable을 저장해두고, 다 소비하면 처음부터 다시 반복

※ itertools 으로 생성 시 단점
- 단순 인덱스 접근보다 무거움
- 매번 next(cycle_obj)를 하게 되면 ,
  제너레이터의 상태를 읽고, 다음 원소를 꺼내고, 상태를 다시 갱신하는 추가 동작(오버헤드) 가 생김
  (= 반복자의 내부 상태 유지/업데이트해야하는 만큼의 추가 비용 있음)
- 리스트 인덱스 접근 = 바로 꺼내오기 (가볍다)
- cycle + next() 접근 = 상태 확인 + 다음 값 꺼내기 + 상태 갱신 (조금 더 무겁다)

 

- 연결 / 분할

  설명 예시
chain(*iterables) 여러 iterable을 앞에서부터 순차적으로 연결  
islice(iterable, stop) /
islice(iterable, start, stop[, step])
반복자에서 일정 범위의 요소만 추출
(next()의 확장)
 
zip_longest(*iterables[, fillvalue=None]) 가장 긴 길이에 맞춰 zip하고 (zip()의 확장)  

 

- 조합, 순열 

  설명 예시
product(*iterables[, repeat=1]) 데카르트 곱 (중복 순열) product('AB', repeat=2) → AA, AB, BA, BB
permutations(iterable[, r]) 순열 생성 permutations('ABC', 2) → AB, AC, BA, ...
combinations(iterable, r) 조합 생성 combinations('ABC', 2) → AB, AC, BC
combinations_with_replacement(iterable, r) 중복 조합 생성 combinations_with_replacement('AB', 2) → AA, AB, BB
※ 매개변수 의미
- r : 뽑을 원소의 개수
※ itertools.permutations, itertools.combinations는 내부적으로 백트래킹 기반

 

- 필터링, 누적

  설명 예시
accumulate(iterable[, function=operator.add][, initial]) 누적 합 / 곱 accumulate([1,2,3]) → 1, 3, 6
filterfalse(predicate, iterable) False인 값만 추출 (filter()의 확장) filterfalse(lambda x: x%2, range(5))
→ 0, 2, 4
dropwhile(predicate, iterable) 조건 False부터 반복 출력 (any()의 확장) dropwhile(lambda x: x<3, [1,2,3,4])
→ 3, 4
takewhile(predicate, iterable) 조건 True인 동안 반복 출력 (all()의 확장) takewhile(lambda x: x<3, [1,2,3,4])
→ 1, 2

 

- 그룹핑, 정렬

  설명 예시
groupby(iterable[, key]) 연속된 값 묶기 (정렬 전제 조건) groupby('AAABBC')
tee(iterable[, n=2]) 복제된 반복자 생성 tee([1,2,3], 2)

 

 

3. more_itertools 주요 함수

  설명 예시
peekable(iterable) 반복자의 다음 값 미리 보기 (next()의 확장)  
next_or_none(iterator[, default=None]) 반복자의 다음 값 가져오기, 끝나면 기본값 반환 (예외 없음)  
spy(iterable[, n=1]) 반복자의 앞부분 미리보기, 상태 유지  
seekable(iterable) 반복자의 현재 위치 저장하고 되돌릴 수 있음  
chunked(iterable, n) 리스트를 n개씩 분할 chunked([1,2,3,4,5], 2) → [[1,2], [3,4], [5]]
windowed(iterable, n[, fillvalue=None]) 슬라이딩 윈도우 windowed([1,2,3,4], 2) → [(1,2), (2,3), (3,4)]
padded(iterable, length[, fillvalue]) 길이 n 맞춤 패딩 padded([1,2], 4, 0) → [1,2,0,0]
split_before(iterable, predicate) 조건이 True일 때마다 iterable을 분할  
interleave(*iterables) 여러 iterable을 교차 병합 interleave('ABC', '123') → A,1,B,2,C,3
collapse(iterable[, base_type][, levels]) 중첩 리스트 평탄화
= 하나의 일렬(flat) 리스트로 만듦
collapse([[1, [2]], 3]) → [1, 2, 3]
distinct_permutations(iterable[, r]) 중복 없는 순열 distinct_permutations([1,1,2])
→ (1,1,2), (1,2,1), (2,1,1)
zip_equal(*iterables) zip() + 길이 불일치 시 예외 발생  
※ 매개변수 의미
- base_type : 더 이상 재귀적으로 펼치지 않을 자료형을 지정 ex) base_type=str → 문자열은 더 분해하지 않음
- levels : 펼칠(flat) 깊이 제한 ex) levels=2 → 2단계까지만 flatten