Python

[Python] Itertools 총정리, 예문

shai-devit 2024. 8. 28. 11:29

Itertools는 조합(Combination) 혹은 순열(Permutation)에 관련된 라이브러리

함수의 종류는 크게 3개로 구분됨

Infinite iterators(무한 이터레이터)

#             Func                                          basic example
count(start, [step])                # count(10, 2) -> 10 12 14 16 18 ... Infinite
cycle(p)                            # cycle('ABCDE' -> A B C D E A B C D E A ... infinite
repeat(element, [repeat])           # repeat(10, 3) -> 10 10 10
                                    # repeat 미입력시 Infinite Repeat

Iterators terminating on the shortest input sequence 

#             Func                                          basic example
accumulate(p, [func])               # accumulate([1,2,3,4,5])     -> 1 3 6 10 15
batched(p, n)                       # batched('ABCDEFG', n = 3)   -> ABC DEG F
chain(p, q)                         # chain('ABC', 'DEF')         -> A B C D E F
chain.from_iterable(iterable)       # chain.from_iterable(['ABC','DEF']) -> A B C D E F
compress(data, selectors)           # compress('ABCDEF',[1,0,1,0,1,0,1,1]) -> A C E F
dropwhile(predicate, seq)           # dropwhile(lambda x: x<5, [1,4,6,3,8]) -> 6 3 8
filterfalse(predicate, seq)         # filterfalse(lambda x: x<5, [1,4,6,3,8]) -> 6 3 8
group by(iterable, [key])           # groupby()
islice(seq, [start], stop, [step])  # islice('ABCDEFG', 2, None)   -> C D E F G
pairwise(iterable)                  # pairwise('ABCDEFG')          -> AB BC CD DE EF FG
starmap(func, seq)                  # starmap(pow, [(2,5), (3,2),(10,3)]) -> 32 9 1000
takewhile(predicate, seq)           # takewhile(lambda x: x<5, [1,4,6,3,8]) -> 1 4
tee(it, n)                          # tee()
zip_longest(p,q,..., [fillvalue])   # zip_longest('ABCD','xy',fillvalue = '-')
                                    #                              -> Ax By C- D-

Combinatoric Iterators(조합 이터레이터)

#             Func                                          basic example
product(p, q, ..., [repeat])        # product('ABCD',repeat=2) -> AA AB AC AD BA BB BC BD
									#                             CA CB CC CD DA DB DC DD
permutations(p, [r])                # permutations('ABCD', 2) -> AB AC AD BA BC BD CA CB 
									#                            CD DA DB DC
combinations(p, r)                  # combinations('ABCD', 2) -> AB AC AD BC BD CD
									# 
combinations_with_replacement(p, r) # combinations_with_replacement('ABCD', 2) -> AA AB AC 
									#                              -> AD BB BC BD CC CD DD

Example Detail


count (start, [step])

from itertools import *

#infinite Iterator 생성 / 10부터 2단위로 출력
c = count(10, 2)   

# 다섯번째 값까지 출력
for i in range(5):
	print(next(c))     #next함수로 출력 가능

---------------------------------------------
#결과

10
12
14
16
18

accumulate(p, [func])

from itertools import *

def mul(x, y): return x * y

acc = accumulate([1,2,3,4,5], mul) #func 미지정시 add로 누적연산

acc_li = list(acc)     # -> [1,2,6,24,120] 저장

for r in acc:
	print(r)

---------------------------------------------
#결과
1
2
6
24
120

dropwhile(predicate, seq) → False를 반환

from itertools import * 

data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
result = dropwhile(lambda x: x%2 != 0, data)

result = list(result)   #-> [2,4,6,8,10] 저장

for r in result:
	print(r)

---------------------------------------------
#결과
2
4
6
8
10

takewhile(predicate, seq) → True를 반환

from itertools import * 

data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
result = takewhile(lambda x: x%2 != 0, data)

result = list(result)   #-> [1,3,5,7,9] 저장

for r in result:
	print(r)

---------------------------------------------
#결과
1
3
5
7
9

product(p, q, ..., [repeat])

from itertools import * 

numbers = [1, 2, 3]
letters = ['a', 'b', 'c']
result1 = product(numbers, letters)
result2 = product(numbers, repeat = 3)

# 모든 조합 출력
for r in result1:
    print(r)
    
# repeat2은 리스트로 출력
print(list(result2))
---------------------------------------------
#결과
(1, 'a')
(1, 'b')
(1, 'c')
(2, 'a')
(2, 'b')
(2, 'c')
(3, 'a')
(3, 'b')
(3, 'c')

[(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 1), (1, 3, 2), (1, 3, 3), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 1, 1), (3, 1, 2), (3, 1, 3), (3, 2, 1), (3, 2, 2), (3, 2, 3), (3, 3, 1), (3, 3, 2), (3, 3, 3)]

permutations(p, [r])

from itertools import * 

Letters = ['ABCD', 'DEFG']
res_1 = permutations(Letters, 2)
res_2 = permutations(Letters[0],3)
res_3 = []
for i in range(1, len(Letters[1])+1):
	res_3.append(list(permutations(Letters[1],i)))
		
print(list(res_1))
print(list(res_2))
print(list(res_3))

---------------------------------------------
#결과
# res_1
[('ABCD', 'DEFG'), ('DEFG', 'ABCD')]
# res_2
[('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'C', 'B'), ('A', 'C', 'D'), ('A', 'D', 'B'), ('A', 'D', 'C'), ('B', 'A', 'C'), ('B', 'A', 'D'), ('B', 'C', 'A'), ('B', 'C', 'D'), ('B', 'D', 'A'), ('B', 'D', 'C'), ('C', 'A', 'B'), ('C', 'A', 'D'), ('C', 'B', 'A'), ('C', 'B', 'D'), ('C', 'D', 'A'), ('C', 'D', 'B'), ('D', 'A', 'B'), ('D', 'A', 'C'), ('D', 'B', 'A'), ('D', 'B', 'C'), ('D', 'C', 'A'), ('D', 'C', 'B')]
# res_3
[[('D',), ('E',), ('F',), ('G',)], [('D', 'E'), ('D', 'F'), ('D', 'G'), ('E', 'D'), ('E', 'F'), ('E', 'G'), ('F', 'D'), ('F', 'E'), ('F', 'G'), ('G', 'D'), ('G', 'E'), ('G', 'F')], [('D', 'E', 'F'), ('D', 'E', 'G'), ('D', 'F', 'E'), ('D', 'F', 'G'), ('D', 'G', 'E'), ('D', 'G', 'F'), ('E', 'D', 'F'), ('E', 'D', 'G'), ('E', 'F', 'D'), ('E', 'F', 'G'), ('E', 'G', 'D'), ('E', 'G', 'F'), ('F', 'D', 'E'), ('F', 'D', 'G'), ('F', 'E', 'D'), ('F', 'E', 'G'), ('F', 'G', 'D'), ('F', 'G', 'E'), ('G', 'D', 'E'), ('G', 'D', 'F'), ('G', 'E', 'D'), ('G', 'E', 'F'), ('G', 'F', 'D'), ('G', 'F', 'E')], [('D', 'E', 'F', 'G'), ('D', 'E', 'G', 'F'), ('D', 'F', 'E', 'G'), ('D', 'F', 'G', 'E'), ('D', 'G', 'E', 'F'), ('D', 'G', 'F', 'E'), ('E', 'D', 'F', 'G'), ('E', 'D', 'G', 'F'), ('E', 'F', 'D', 'G'), ('E', 'F', 'G', 'D'), ('E', 'G', 'D', 'F'), ('E', 'G', 'F', 'D'), ('F', 'D', 'E', 'G'), ('F', 'D', 'G', 'E'), ('F', 'E', 'D', 'G'), ('F', 'E', 'G', 'D'), ('F', 'G', 'D', 'E'), ('F', 'G', 'E', 'D'), ('G', 'D', 'E', 'F'), ('G', 'D', 'F', 'E'), ('G', 'E', 'D', 'F'), ('G', 'E', 'F', 'D'), ('G', 'F', 'D', 'E'), ('G', 'F', 'E', 'D')]]

combinations(p, r)

from itertools import * 

res_1 = list(combinations("ABCD", 3))
res_2 = list(combinations([5,2,3,4], 3))

print(res_1)
print(res_2)
---------------------------------------------
#결과
# res_1
[('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'C', 'D'), ('B', 'C', 'D')]
# res_2
[(5, 2, 3), (5, 2, 4), (5, 3, 4), (2, 3, 4)]

combinations_with_replacement(p, r)

from itertools import * 

res_1 = list(combinations_with_replacement("ABCD", 3))
res_2 = list(combinations_with_replacement([5,2,3,4], 3))

print(res_1)
print(res_2)
---------------------------------------------
#결과
# res_1
[('A', 'A', 'A'), ('A', 'A', 'B'), ('A', 'A', 'C'), ('A', 'A', 'D'), ('A', 'B', 'B'), ('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'C', 'C'), ('A', 'C', 'D'), ('A', 'D', 'D'), ('B', 'B', 'B'), ('B', 'B', 'C'), ('B', 'B', 'D'), ('B', 'C', 'C'), ('B', 'C', 'D'), ('B', 'D', 'D'), ('C', 'C', 'C'), ('C', 'C', 'D'), ('C', 'D', 'D'), ('D', 'D', 'D')]
# res_2
[(5, 5, 5), (5, 5, 2), (5, 5, 3), (5, 5, 4), (5, 2, 2), (5, 2, 3), (5, 2, 4), (5, 3, 3), (5, 3, 4), (5, 4, 4), (2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 3, 3), (2, 3, 4), (2, 4, 4), (3, 3, 3), (3, 3, 4), (3, 4, 4), (4, 4, 4)]