itertools — 효율적인 루핑을 위한 이터레이터 생성 함수
itertools — 효율적인 루핑을 위한 이터레이터 생성 함수
itertools 모듈은 APL, Haskell, SML의 구조에서 영감을 받은 여러 이터레이터 빌딩 블록을 구현해요. 각각은 파이썬에 적합한 형태로 재구성됐어요. 이 모듈은 그 자체로 또는 조합되어 유용한 빠르고 메모리 효율적인 핵심 도구 집합을 표준화해요. 이들이 함께 형성하는 “이터레이터 대수(iterator algebra)”는 순수 파이썬에서 특수화된 도구를 간결하고 효율적으로 구성할 수 있게 해줘요.
예를 들어 SML은 tabulate(f)라는 표 작성 도구를 제공해 시퀀스 f(0), f(1), ...을 만들어요. 파이썬에서는 map()과 count()를 결합해 map(f, count())로 같은 효과를 얻을 수 있어요.
본문
일반 이터레이터:
| 이터레이터 | 인자 | 결과 |
|---|---|---|
accumulate() |
p [,func] | p0, p0+p1, p0+p1+p2, … |
batched() |
p, n | (p0, p1, …, p_n-1), … |
chain() |
p, q, … | p0, p1, … plast, q0, q1, … |
chain.from_iterable() |
iterable | p0, p1, … plast, q0, q1, … |
compress() |
data, selectors | (d[0] if s[0]), (d[1] if s[1]), … |
count() |
[start[, step]] | start, start+step, start+2*step, … |
cycle() |
p | p0, p1, … plast, p0, p1, … |
dropwhile() |
predicate, seq | predicate가 실패할 때 시작하는 seq[n], seq[n+1], … |
filterfalse() |
predicate, seq | predicate(elem)이 실패하는 seq의 요소 |
groupby() |
iterable[, key] | key(v) 값으로 그룹화된 하위 이터레이터 |
islice() |
seq, [start,] stop [, step] | seq[start:stop:step]의 요소 |
pairwise() |
iterable | (p[0], p[1]), (p[1], p[2]) |
repeat() |
elem [,n] | 끝없이 또는 최대 n번 elem, elem, elem, … |
starmap() |
func, seq | func(*seq[0]), func(*seq[1]), … |
takewhile() |
predicate, seq | predicate가 실패할 때까지의 seq[0], seq[1], … |
tee() |
it, n | it1, it2, … itn. 하나의 이터레이터를 n개로 분할 |
zip_longest() |
p, q, … | (p[0], q[0]), (p[1], q[1]), … |
조합 이터레이터:
| 이터레이터 | 인자 | 결과 |
|---|---|---|
product() |
p, q, … [repeat=1] | 데카르트 곱, 중첩 for 루프와 동일 |
permutations() |
p[, r] | r 길이 튜플, 모든 가능한 순서, 반복 요소 없음 |
combinations() |
p, r | r 길이 튜플, 정렬된 순서, 반복 요소 없음 |
combinations_with_replacement() |
p, r | r 길이 튜플, 정렬된 순서, 반복 요소 있음 |
Itertool 함수
itertools.accumulate(iterable[, function, *, initial=None]) — 누적 합 또는 다른 이진 함수의 누적 결과를 반환하는 이터레이터를 만들어요. 함수는 기본적으로 덧셈이에요. initial 값을 제공하면 누적이 그 값으로 시작하고 출력이 입력 iterable보다 한 요소 더 많아요. functools.reduce()를 참고하세요.
>>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
>>> list(accumulate(data, max)) # running maximum
[3, 4, 6, 6, 6, 9, 9, 9, 9, 9]
itertools.batched(iterable, n, *, strict=False) — iterable의 데이터를 길이 n의 튜플로 배치해요. 마지막 배치는 n보다 짧을 수 있어요. strict가 참이면 마지막 배치가 n보다 짧을 때 ValueError가 발생해요. 버전 3.12에서 추가됨.
itertools.chain(*iterables) — 첫 번째 iterable이 소진될 때까지 요소를 반환한 다음, 모든 iterable이 소진될 때까지 다음 iterable로 진행하는 이터레이터를 만들어요. classmethod chain.from_iterable(iterable) — 지연 평가되는 단일 iterable 인자에서 체인된 입력을 얻는 chain()의 대체 생성자예요.
itertools.combinations(iterable, r) — 입력 iterable의 요소에서 r 길이 부분 시퀀스를 반환해요. 조합 튜플은 입력 iterable의 순서에 따라 사전 순으로 산출돼요. 요소는 값이 아니라 위치에 따라 고유하게 취급돼요.
itertools.combinations_with_replacement(iterable, r) — 입력 iterable의 요소에서 개별 요소의 반복을 허용하는 r 길이 부분 시퀀스를 반환해요. 버전 3.1에서 추가됨.
itertools.compress(data, selectors) — selectors의 해당 요소가 참인 data의 요소를 반환하는 이터레이터를 만들어요. 버전 3.1에서 추가됨.
itertools.count(start=0, step=1) — start로 시작하는 균등한 간격의 값을 반환하는 이터레이터를 만들어요. map()과 함께 연속 데이터 포인트를 생성하거나 zip()과 함께 시퀀스 번호를 추가하는 데 사용할 수 있어요.
itertools.cycle(iterable) — iterable의 요소를 반환하고 각각의 사본을 저장하는 이터레이터를 만들어요. iterable이 소진되면 저장된 사본에서 요소를 반환해 무한히 반복해요.
itertools.dropwhile(predicate, iterable) — predicate이 참인 동안 iterable의 요소를 버리고 그 후에는 모든 요소를 반환하는 이터레이터를 만들어요.
itertools.filterfalse(predicate, iterable) — predicate이 거짓 값을 반환하는 요소만 반환하도록 iterable의 요소를 필터링하는 이터레이터를 만들어요. predicate가 None이면 거짓인 항목을 반환해요.
itertools.groupby(iterable, key=None) — iterable에서 연속적인 키와 그룹을 반환하는 이터레이터를 만들어요. key는 각 요소에 대한 키 값을 계산하는 함수예요. 일반적으로 iterable은 같은 키 함수로 이미 정렬되어 있어야 해요. 반환된 그룹은 groupby()와 기반 iterable을 공유하는 그 자체 이터레이터예요. 데이터가 나중에 필요하면 리스트로 저장해야 해요.
itertools.islice(iterable, stop) / itertools.islice(iterable, start, stop[, step]) — iterable에서 선택된 요소를 반환하는 이터레이터를 만들어요. 시퀀스 슬라이싱처럼 동작하지만 start, stop, step에 음수 값을 지원하지 않아요.
itertools.pairwise(iterable) — 입력 iterable에서 가져온 연속적인 겹치는 쌍을 반환해요. 출력 이터레이터의 2-튜플 수는 입력 수보다 하나 적어요. 버전 3.10에서 추가됨.
itertools.permutations(iterable, r=None) — iterable의 요소에서 연속적인 r 길이 순열을 반환해요. r이 지정되지 않거나 None이면 r은 iterable의 길이로 기본 설정되고 모든 가능한 전체 길이 순열이 생성돼요.
itertools.product(*iterables, repeat=1) — 입력 iterable의 데카르트 곱이에요. product(A, B)는 ((x,y) for x in A for y in B)와 같고, product(A, repeat=4)는 product(A, A, A, A)와 같아요. 실행 전에 입력 iterable을 완전히 소비하므로 유한 입력에만 유용해요.
itertools.repeat(object[, times]) — object를 계속해서 반환하는 이터레이터를 만들어요. times 인자가 지정되지 않으면 무한히 실행돼요. map이나 zip에 상수 값 스트림을 공급하는 데 흔히 사용돼요:
>>> list(map(pow, range(10), repeat(2)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
itertools.starmap(function, iterable) — iterable에서 얻은 인자를 사용해 함수를 계산하는 이터레이터를 만들어요. 인자 파라미터가 이미 튜플로 “pre-zipped”된 경우 map() 대신 사용돼요. map()과 starmap()의 차이는 function(a,b)와 function(*c)의 차이와 평행해요.
itertools.takewhile(predicate, iterable) — predicate이 참인 동안 iterable의 요소를 반환하는 이터레이터를 만들어요. predicate 조건을 처음 실패하는 요소는 입력 이터레이터에서 소비되며 접근할 수 없어요.
itertools.tee(iterable, n=2) — 단일 iterable에서 n개의 독립적인 이터레이터를 반환해요. tee 이터레이터는 스레드 안전하지 않아요. 일반적으로 한 이터레이터가 다른 이터레이터가 시작되기 전에 데이터 대부분을 사용한다면 tee() 대신 list()를 사용하는 것이 더 빠르다는 점에 유의하세요.
itertools.zip_longest(*iterables, fillvalue=None) — 각 iterable의 요소를 집계하는 이터레이터를 만들어요. iterable 길이가 고르지 않으면 누락된 값은 fillvalue로 채워져요. 가장 긴 iterable이 소진될 때까지 반복돼요.
Itertools 레시피
이 섹션은 기존 itertools를 빌딩 블록으로 사용해 확장된 도구 집합을 만드는 레시피를 보여줘요. 주 목적은 교육적이에요. sliding_window(), derangements(), sieve() 레시피가 현재 테스트 중이에요. 이 레시피들과 훨씬 많은 것들은 Python Package Index의 more-itertools 프로젝트에서 설치할 수 있어요:
python -m pip install more-itertools
대표적인 레시피:
def take(n, iterable):
"Return first n items of the iterable as a list."
return list(islice(iterable, n))
def flatten(list_of_lists):
"Flatten one level of nesting."
return chain.from_iterable(list_of_lists)
def unique_everseen(iterable, key=None):
"Yield unique elements, preserving order. Remember all elements ever seen."
seen = set()
for element in filterfalse(seen.__contains__, iterable):
seen.add(element)
yield element
def powerset(iterable):
"Subsequences of the iterable from shortest to longest."
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))