| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 코딩테스트
- parser
- 프로그래밍패러다임
- 베이직
- PYTHON
- 함수형프로그래밍
- BFS
- ReactNative
- OOP
- sql
- defaultdict
- database
- 파일시스템
- CSS
- SQLD
- DFS
- folium
- Graph
- 단위테스트
- pandas
- 챌린지
- db
- display
- 부스트캠프
- 가상메모리
- 보안솔루션
- flexbox
- reactnavigation
- 이벤트처리
- javascript
- Today
- Total
DevLog
[Python] iterator(반복자)란? - itertools를 이용한 효율적인 데이터 순회 방법 본문
iterator
통칭 반복자.
배열과 같이 여러 개의 데이터로 구성된 자료구조의 내부 요소를 순회하는 객체다.
내장 `next()` 메소드를 호출하여 다음 요소를 가져오는 행위를 반복함으로써
StopIteration 예외가 발생할 때까지 일련의 데이터 스트림을 읽어오는 방식으로 작동한다.
파이썬에서 순회가 가능한 대표적인 자료구조 타입으로는 list, tuple, range 객체 등이 있으며,
이것들을 포함하여 반복문을 통해 순회가 가능한 개체들을 `iterable` 타입으로 분류한다.
📌 range 객체란?
흔히 for문에서 반복의 범위를 지정할 때 사용하는 range() 함수를 통해 생성되는 객체를 말한다.
이는 전달받은 특정 숫자 사이의 정수를 원소로 가지는 반복할 수 있는(iterable) 객체로, 표현하는 범위의 크기에 무관하게 항상 같은 양의 작은 메모리를 사용한다는 장점이 있다.
itertools
Functions creating iterators for efficient looping.
파이썬에서 빠르고 효율적인 데이터 순회를 위한 tool을 표준화해놓은 모듈이다.
해당 모듈 함수들은 모두 이터레이터를 생성하고 반환하며, 순회를 통해서 받아 온 데이터를 이용하는 기능을 갖는다.
count(start)
start부터 1씩 키워가며 숫자를 세는 무한 iterator
count(5)
# --> 5 6 7 8 9 ...
이렇게 무한한 길이의 결과를 반환하는 iterator같은 경우, 호출 시 루프의 범위를 지정할 수 있도록 해야한다.
accumulate(iterable, func=operator.add, *, initial=None)
iterable 객체와 적용할 함수를 전달받아서 누적 결과를 반환하는 함수
accumulate([1, 2, 3, 4, 5])
# --> 1 3 6 10 15
accumulate([1, 2, 3, 4, 5], initial = 50)
# --> 50, 51, 53, 56, 60, 65
기본적으로 누적 합계의 결과를 반환하지만, 다른 함수를 인자로 전달하여 결과를 내는 것도 가능하다.
initial 키워드 값을 넣어주면 누적의 시작 값이 해당 값으로 설정된다.
pairwise(iterable)
iterable 객체를 받아서 원소를 순서대로 둘씩 짝지어 반환하는 함수
pairwise('ABCDEFG')
#--> AB BC CD DE EF FG
zip(*iterables)
iterable 객체들을 받은 후, 각 원소를 순서대로 묶어서 반환하는 함수
zip([1, 2, 3], ('A', 'B', 'C'))
# --> (1, 'A')
# (2, 'B')
# (3, 'C')
이때, 두 객체의 원소 개수가 동일하지 않더라도 더 적은 쪽에 맞춰서 에러 없이 결과가 반환된다. (남는 값은 버림)
zip_longest(*iterables, fillvalue = None)
iterable 객체를 받은 후, 각 원소를 순서대로 묶어서 반환하는 함수
zip_longest('ABCD', 'xy', fillvalue='-')
# --> (A, x)
# (B, y)
# (C, -)
# (D, -)
앞선 `zip()` 함수와 유사하게 동작하지만, 원소 개수가 동일하지 않을 때 더 많은 쪽에 맞춰서 결과가 반환된다.
이때, 누락된 값은 `fillvalue`로 전달한 값으로 채워진다.
순열과 조합 (permutations, combinations)
코딩테스트 문제를 풀다보면 심심치 않게 볼 수 있는 순열과 조합 풀이법
`itertools.permutations`, `itertools.combinations` 를 사용하면 중첩 for문으로 완전탐색을 구현하지 않고도 쉽게 문제를 해결할 수 있다.
순열 = n개의 원소 중 서로 다른 r개를 골라 순서를 고려하여 나열한 경우의 수 (AB != BA)
반복 요소 없이 가능한 모든 순서로 순열을 생성하고, 결과를 반환한다.
permutation(iterable, r = None)
iterable 객체를 받아서 r 길이의 순열을 생성, 반환하는 함수
permutations('ABCD', 2)
# --> AB AC AD BA BC BD CA CB CD DA DB DC
permutations(range(3)) # 0, 1, 2
# --> 012 021 102 120 201 210
조합 = n개의 원소 중 r개를 뽑아 순서를 고려하지 않고 나열한 경우의 수 (AB == BA)
반복 요소 없이 정렬된 순서로 조합을 생성하고, 결과를 반환한다.
combination(iterable, r)
iterable 객체를 받아서 r 길이의 조합을 생성, 반환하는 함수
combinations('ABCD', 2)
# --> AB AC AD BC BD CD
combinations(range(4), 3)
# --> 012 013 023 123
itertools — Functions creating iterators for efficient looping
This module implements a number of iterator building blocks inspired by constructs from APL, Haskell, and SML. Each has been recast in a form suitable for Python. The module standardizes a core set...
docs.python.org
'프로그래밍 언어 > Python' 카테고리의 다른 글
| [Python] any()와 all(), OR과 AND (1) | 2023.10.16 |
|---|---|
| [Python] index() vs. find() (0) | 2023.10.06 |
| 파이썬으로 서울시 따릉이 지도 만들기 (+α) - folium 마커 클러스터 MarkerCluster, 미니맵 MiniMap 추가하기 (0) | 2023.09.01 |
| 파이썬으로 서울시 따릉이 지도 만들기 (3) - folium 라이브러리로 지도 시각화하기 (0) | 2023.09.01 |
| 파이썬으로 서울시 따릉이 지도 만들기 (2) - 데이터 변환하기 (0) | 2023.08.31 |