반응형

Itertools

  • APL, Haskell, SML에 영감을 받아 파이썬에 최적화되어 동작하도록 구성된 반복 연산자 패키지로 자체 또는 조합되어 효율적이고 빠르게 동작하며 operator 모듈과 효과적으로 동작함
  • 코딩 테스트 풀이 시 굉장히 유용하게 사용되는 패키지 중 하나
  • generator와 같이 사용할 수 있다. (generator가 궁금하시다면 => "링크")

* operator 모듈 : 파이썬의 내장 연산자에 해당하는 __add__ 등을 제공하는 패키지로 add, lt, ne 등 객체 비교, 논리 연산, 수학 연산, 시퀀스 등을 수행하는데, __func__ 가 아니라 단일 이름으로 제공되는 차이가 있음

I. 무한 반복

반복 연산자를 무한히 수행하기 때문에 while, try/except 구문 등과 조합하여 사용하는 경우가 많음, 단일 실행 시 cpu over 전까지 계속 실행됨

1. count(start, [step]) , cycle(p)

import itertools

>>> itertools.count(100)
100
101
102
...

>>> itertools.cycle("반복")
반
복
반
복
...

2. repeat(p, [n])

>>> itertools.repeat(5, 3)
5
5
5

II. 단일수행

1. accumulate(p, [func])

  • 누적 연산을 수행
accumul = itertools.accumulate([x for x in range(1,10)])
result = []
for v in accumul :
    result.append(v)

>>> print(result)
[1, 3, 6, 10, 15, 21, 28, 36, 45]

2. compress(d,s)

  • input과 구분자를 비교해 구분자가 '1 or true'에 대응하는 경우만 출력
compress = itertools.compress('누가나올까요?', [1,0,1,0,1,0,1])
result = []
for v in compress:
    result.append(v)

>>> print(result)
['누', '나', '까', '?']

3. chain(a,b,c,..) , chain.from_iterable(iter_data), zip_longest(a,b,c,...)

1) chain

  • input value를 순서대로 연결
chain1 = itertools.chain('이어', '진다','우와')

>>> while True :
    try :
        print(next(chain1))
    except StopIteration :
        break
이
어
진
다
우
와

chain2 = itertools.chain.from_iterable('문자열도 iterable 객체라 가능합니다.')
result = []
for v in chain2:
    result.append(v)

>>> print(result)
['문', '자', '열', '도', ' ', 'i', 't', 'e', 'r', 'a', 'b', 'l', 'e', ' ', '객', '체', '라', ' ', '가', '능', '합', '니', '다', '.']

2) zip_longest

  • input value의 index별로 매칭하여 튜플로 출력
  • 가장 길이가 긴 input value를 기준하여 연결하기 때문에 fillvalue='' 대체 값을 지정 가능
zip = itertools.zip_longest('abcd','ef', fillvalue='_')
zip_result = []

for v in zip:
    zip_result.append(v)

>>> print(zip_result)
[('a', 'e'), ('b', 'f'), ('c', '_'), ('d', '_')]

>>> print(type(zip_result[0]))
<class 'tuple'>

III. 조건절 수행

1. filterflase(p,seq)

  • 조건절의 답이 false인 경우만 출력
filterfalse = itertools.filterfalse(lambda x : x > 5, [1,11,9,7,5,9,13])
filterfalse_result = []
for a in filterfalse:
    filterfalse_result.append(a)

>>> print(filterfalse_result)
[1,5]

2. takewhile(p,seq)

  • seq의 값을 탐색하여 조건이 false가 되기 전까지 수행
takewhile = itertools.takewhile(lambda x : x < 5, [1,2,3,4,5,6,7,8,9,10])
takewhile_result = []
for c in takewhile:
    takewhile_result.append(c)

>>> print(takewhile_result)
[1, 2, 3, 4]

3. dropwhile(p,seq)

  • seq의 값을 탐색하여 조건이 false가 되는 순간부터 값을 출력
dropwhile = itertools.dropwhile(lambda x : x < 5, [1,2,3,4,5,6,7,8,9,10])
dropwhile_result = []
for b in dropwhile:
    dropwhile_result.append(b)

>>> print(dropwhile_result)
[5, 6, 7, 8, 9, 10]

4. groupby(data,key=[None])

  • unique 필터와 유사한 기능을 수행
  • sql의 group by와 유사하지만 공통 요소를 기준으로 다른 요소를 집계하는 sql의 group by와 달리 data내에 동일한 key값에 대한 집계를 하는 차이가 있음
groupby = itertools.groupby('AAABBCCCCDDEEE')

>>> for chr, group in groupby:
    print(chr, ' : ', list(group))

A  :  ['A', 'A', 'A']
B  :  ['B', 'B']
C  :  ['C', 'C', 'C', 'C']
D  :  ['D', 'D']
E  :  ['E', 'E', 'E']

IV. 조합식 사용

1. product(p, repeat = n)

  • input value를 n번 조합하는 모든 경우의 수를 튜플로 출력(중복순열)
product = itertools.product('abc', repeat=3)
result = []
for v in product:
    result.append(v)

>>> print(result)
[('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'a', 'c'), ('a', 'b', 'a'), ('a', 'b', 'b'), ('a', 'b', 'c'), ('a', 'c', 'a'), ('a', 'c', 'b'), ('a', 'c', 'c'), ('b', 'a', 'a'), ('b', 'a', 'b'), ...]

2. permutations(p, n)

  • 순열을 수행함
permutaion = itertools.permutations('abc', 2)
result = []

for v in permutaion:
    result.append(v)

>>> print(result)
[('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]

3. combination(p,n), combination_with_replacement(p,n)

  • 조합, 즉 순서가 없는 순열을 수행하는데 combination_with_replacement()는 반복 요소까지 허용하여 연산을 수행
combination = itertools.combinations('abc', 2)
combi_result = []

for v in combination:
    combi_result.append(v)

>>> print(combi_result)
[('a', 'b'), ('a', 'c'), ('b', 'c')]
combination_repl = itertools.combinations_with_replacement('abc',2)
combi_repl_result = []

for v in combination_repl :
    combi_repl_result.append(v)

>>> print(combi_repl_result)
[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')]
반응형
복사했습니다!