관련글 :
| 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
'Language & Tool > Python' 카테고리의 다른 글
| 🐍파이썬 함수 인자의 유연성 (0) | 2025.07.01 |
|---|---|
| 🐍얕은 복사, 깊은 복사 비교 (1) | 2025.07.01 |
| 🌱논리 연산과 비트 연산(Python) (1) | 2025.06.18 |
| 🐍내부에서 작동하는 이중 밑줄 메서드 (+ 네임 맹글링, 단일 밑줄) (1) | 2025.06.17 |
| 🐍정밀 소수점 제어 모듈, decimal (1) | 2025.06.17 |