Python/라이브러리

파이썬(python) 라이브러리 - itertools (순열, 조합, 누적합)

snowman95 2021. 4. 21. 13:34
728x90
반응형

itertools 라이브러리


순열 : 서로다른 n개 에서 서로 다른 r개 선택하여 순서대로 나열

list(permutations(data, 선택할 개수))

from itertools import permutations

a=list(permutations(data,1)) 
b=list(permutations(data,2)) 
c=list(permutations(data,3)) 

data = ['A','B','C']
[('A',), ('B',)]
[('A', 'B'), ('B', 'A')]
[]

data = [1,2]
[(1,), (2,)]
[(1, 2), (2, 1)]
[]

data = ['A','B','C']
[('A',), ('B',), ('C',)]
[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
[('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]

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

 

조합 : 서로다른 n개에서 순서 상관없이 서로 다른 r개 선택

list(combinations(data, 선택할 개수))

from itertools import combinations

a=list(combinations(data,1)) 
b=list(combinations(data,2)) 
c=list(combinations(data,3)) 

data = ['A','B']
[('A',), ('B',)]
[('A', 'B')]
[]

data = [1,2]
[(1,), (2,)]
[(1, 2)]
[]

data = ['A','B','C']
[('A',), ('B',), ('C',)]
[('A', 'B'), ('A', 'C'), ('B', 'C')]
[('A', 'B', 'C')]

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

 

중복 순열 : 서로다른 n개 에서 중복허용하여 r개 선택하여 순서대로 나열

 

list(product(data, repeat=선택할 개수))

from itertools import product

a=list(product(data, repeat=1))
b=list(product(data, repeat=2))
c=list(product(data, repeat=3))

data = ['A','B']
[('A',), ('B',)]
[('A', 'A'), ('A', 'B'), ('B', 'A'), ('B', 'B')]
[('A', 'A', 'A'), ('A', 'A', 'B'), ('A', 'B', 'A'), ('A', 'B', 'B'), ('B', 'A', 'A'), ('B', 'A', 'B'), ('B', 'B', 'A'), ('B', 'B', 'B')]

data = [1,2]
[(1,), (2,)]
[(1, 1), (1, 2), (2, 1), (2, 2)]
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]

data = ['A','B','C']
[('A',), ('B',), ('C',)]
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
[('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'), ('B', 'A', 'C'), ('B', 'B', 'A'), ('B', 'B', 'B'), ('B', 'B', 'C'), ('B', 'C', 'A'), ('B', 'C', 'B'), ('B', 'C', 'C'), ('C', 'A', 'A'), ('C', 'A', 'B'), ('C', 'A', 'C'), ('C', 'B', 'A'), ('C', 'B', 'B'), ('C', 'B', 'C'), ('C', 'C', 'A'), ('C', 'C', 'B'), ('C', 'C', 'C')]

data = [1,2,3]
[(1,), (2,), (3,)]
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
[(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)]

 

중복 조합 : 서로다른 n개에서 중복 허용하여 순서 상관없이 선택

 

list(combinations_with_replacement(data, 선택할 개수))

from itertools import combinations_with_replacement
a=list(combinations_with_replacement(data,1)) 
b=list(combinations_with_replacement(data,2)) 
c=list(combinations_with_replacement(data,3)) 

data = ['A','B']
[('A',), ('B',)]
[('A', 'A'), ('A', 'B'), ('B', 'B')]
[('A', 'A', 'A'), ('A', 'A', 'B'), ('A', 'B', 'B'), ('B', 'B', 'B')]

data = [1,2]
[(1,), (2,)]
[(1, 1), (1, 2), (2, 2)]
[(1, 1, 1), (1, 1, 2), (1, 2, 2), (2, 2, 2)]

data = ['A','B','C']
[('A',), ('B',), ('C',)]
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
[('A', 'A', 'A'), ('A', 'A', 'B'), ('A', 'A', 'C'), ('A', 'B', 'B'), ('A', 'B', 'C'), ('A', 'C', 'C'), ('B', 'B', 'B'), ('B', 'B', 'C'), ('B', 'C', 'C'), ('C', 'C', 'C')]

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

 

순열 조합은 N과 M 시리즈를 풀어보면 마스터 된다.

순열 vs 조합

뽑은 수열은 오름차순 이어야한다  → 조합

 

중복 vs 그냥

N개 중 중복 없이 M개 골라야한다 → 순열조합
같은 수를 여러 번 골라도 된다      → 중복 순열조합

 

 

문제집: N과 M (시리즈)

 

www.acmicpc.net

 

누적합  : iterbale의 누적합을 구하여 iterable객체로 반환

itertools.accumulate(iteratble)

import sys
import itertools
a = itertools.accumulate([1,2,3,4,5])
print(a)
<itertools.accumulate object at 0x00000219AD7DC680>

print(list(a))
[1, 3, 6, 10, 15]

 

관련 문제

백준 11399 : ATM

반응형