파이썬에서 순열이나 조합을 사용해야 하는 경우가 있습니다. (알고리즘 풀때 자주 보이는 편)

이때 간편하게 사용할 수 있는 파이썬 라이브러리인 itertools 가 있습니다.

itertools에는 다양한 기능이 있지만 조합형 이터레이터에 사용되는 함수를 알아보겠습니다.


itertools

결과
product(‘ABCD’, repeat=2) AA, AB, AC, AD, BA, BB, BC, BD, CA, CB, CC, CD, DA, DB, DC, DD
permutations(‘ABCD’, 2) AB, AC, AD, BA, BC, BD, CA, CB, CD, DA, DB, DC
combinations(‘ABCD’, 2) AB, AC, AD, BC, BD, CD
combinations_with_replacement(‘ABCD’, 2) AA, AB, AC, AD, BB, BC, BD, CC, CD, DD

1. product()

itertools.product(*iterables, repeat=1)

iterables 의 데카르트 곱을 표현. 즉, 모든 값에 대해 중첩을 허용하는 짝을 지어줍니다.

product(A, B)((x, y) for x in A for y in B) 와 같은 결과를 반환합니다.

다음 코드를 예시로 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
from itertools import product
 
data = ['A''B''C']
 
print(list(product(data,repeat=2)))
 
-------------------------------------------------
 
# 출력 결과
 
[('A''A'), ('A''B'), ('A''C'), ('B''A'), ('B''B'), ('B''C'), ('C''A'), ('C''B'), ('C''C')]


2. permutations()

itertools.permutations(iterable, r=None)

iterable 에서 요소의 연속된 길이 r 순열을 반환합니다.

자기 자신을 포함하지 않는 순열이 생성 됩니다. r값을 지정하지 않으면 최대 길이의 순열이 반환됩니다.

1
2
3
4
5
6
7
8
9
10
11
from itertools import permutations
 
data = ['A''B''C']
 
print(list(permutations(data, 2)))
 
-------------------------------------------------
 
# 출력 결과
 
[('A''B'), ('A''C'), ('B''A'), ('B''C'), ('C''A'), ('C''B')]


3. combinations()

itertools.combinations(iterable, r)

iterable에서 요소의 길이 r 서브 시퀀스들을 반환합니다. 자기 자신 및 다른 요소와 중복되지 않은 조합 튜플이 생성됩니다. 즉, 원소의 개수가 r개인 조합 생성

1
2
3
4
5
6
7
8
9
10
11
from itertools import combinations
 
data = ['A''B''C']
 
print(list(combinations(data, 2)))
 
-------------------------------------------------
 
# 출력 결과
 
[('A''B'), ('A''C'), ('B''C')]


4. combinations_with_replacement()

itertools.combinations_with_replacement(iterable, r)

iterable에서 요소의 길이 r 서브 시퀀스들을 반환하지만, 개별 요소를 두 번 이상 반복합니다. 즉, 원소의 개수가 r개인 중복 조합 생성.

1
2
3
4
5
6
7
8
9
10
11
from itertools import combinations_with_replacement
 
data = ['A''B''C']
 
print(list(combinations_with_replacement(data, 2)))
 
-------------------------------------------------
 
# 출력 결과
 
[('A''A'), ('A''B'), ('A''C'), ('B''B'), ('B''C'), ('C''C')]


알고리즘 문제를 풀 때, 많이 사용되는 라이브러리 중 하나인 itertools를 알아봤습니다. 위에 설명한 4종류의 조합형 이터레이터 외에도 다양한 명령어들이 있습니다.

자세한 내용은 아래 공식문서를 참고하시면 됩니다.

https://docs.python.org/ko/3/library/itertools.html