사용전 주의사항: permutations, combinations, product 세 메소드 모두 generator이기 때문에 list()로 캐스팅하여 다른 곳에 저장해두지 않으면 한번의 루핑 이후 사라지게 됩니다.
1. itertools.permutations(iterable, r=None)
iterable에서 길이 r에 해당하는 순열을 리턴하는 함수이다.
r이 지정되지 않았거나 None이면, r의 기본값은 iterable의 길이이며 가능한 모든 최대 길이 순열이 생성된다.
순열(permutation) 튜플은 입력 iterable의 순서에 따라 사전식 순서로 방출된다. 따라서, 입력 iterable이 정렬되어 있으면, 순열 튜플이 정렬된 순서로 생성된다.
리턴값은 객체이며 경우의 수에 대한 쌍을 tuple형식으로 반환한다.
import itertools
pool = ['A', 'B', 'C']
print(itertools.permutations(pool))
# <itertools.permutations object at 0x000002814DCEA288> : 객체
print(list(map(''.join, itertools.permutations(pool)))) # 3개의 원소로 수열 만들기
# ['ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA']
for x in itertools.permutations(pool):
print(x)
# ('A', 'B', 'C')
# ('A', 'C', 'B')
# ('B', 'A', 'C')
# ('B', 'C', 'A')
# ('C', 'A', 'B')
# ('C', 'B', 'A')
print(list(map(''.join, itertools.permutations(pool, 2)))) # 2개의 원소로 수열 만들기
# ['AB', 'AC', 'BA', 'BC', 'CA', 'CB']
2. itertools.combinations(iterable, r=None)
iterable에서 r개를 선택할 수 있는 조합을 이터레이터로 리턴하는 함수
import itertools
pool = ['A', 'B', 'C']
print(list(map(''.join, itertools.combinations(pool)))) # 3개의 원소로 조합 만들기
print(list(map(''.join, itertools.combinations(pool, 2)))) # 2개의 원소로 조합 만들기
3. itertools.product(*iterables, repeat=1)
데카르트 곱이라고도 하는 cartesian product를 표현할 때 사용하는 메소드이다
두 개 이상의 iterable의 모든 조합을 구할 때 사용된다.
3개의 string 'ABCD', 'xy', '1234'의 곱집합을 보통 다음과 같이 for문을 이용해서 구한다.
iterable1 = 'ABCD'
iterable2 = 'xy'
iterable3 = '1234'
for i in iterable1:
for j in iterable2:
for k in iterable3:
print(i + j + k, end=" ")
itertools.product를 이용하면 for문을 사용하지 않고도 곱집합을 구할 수 있다.
import itertools
iterable1 = 'ABCD'
iterable2 = 'xy'
iterable3 = '1234'
print(list(map("".join, itertools.product(iterable1, iterable2, iterable3))))
# ['Ax1', 'Ax2', 'Ax3', 'Ax4', 'Ay1', 'Ay2', 'Ay3', 'Ay4', 'Bx1', 'Bx2', 'Bx3', 'Bx4', 'By1', 'By2', 'By3', 'By4', 'Cx1', 'Cx2', 'Cx3', 'Cx4', 'Cy1', 'Cy2', 'Cy3', 'Cy4', 'Dx1', 'Dx2', 'Dx3', 'Dx4', 'Dy1', 'Dy2', 'Dy3', 'Dy4']
4. itertools.combinations_with_replacement(iterable, r)
iterable에서 r개를 선택할 수 있는 중복조합을 이터레이터로 리턴하는 함수
from itertools import combinations_with_replacement
print(combinations_with_replacement('ABCD', 2))
# 결과: AA AB AC AD BB BC BD CC CD DD
요약
반복자 | 인수 | 결과 |
product() | p, q, ... [ 반복 = 1 ] | 중첩된 for loop에 해당하는 데카르트의 곱 |
permutations() | p [, r] | r 길이 tuple, 가능한 모든 순서, 반복 X |
combinations() | p, r | r 길이 tuple, 정렬된 순서, 반복 X |
combinations_with_replacement() | p, r | r 길이 tuple, 정렬된 순서, 반복 O |
참고: https://docs.python.org/ko/3/library/itertools.html#itertools.permutations,
https://programmers.co.kr/learn/courses/4008,
https://geonlee.tistory.com/69,
'Python' 카테고리의 다른 글
[Python] Collections (deque, OrderedDict, defaultdict, Counter) (2) | 2024.02.13 |
---|---|
[Python] Data Type (list, tuple, dictionary, string) (0) | 2023.06.16 |
[Python] set (집합 자료형) (0) | 2023.02.21 |
[Python] 우선순위 큐 (PriorityQueue) (0) | 2023.01.19 |
[Python] enumerate 와 zip (0) | 2022.11.09 |