[Python] itertools을 이용한 순열과 조합 사용하기
파이썬에서 순열이나 조합을 사용해야 하는 경우가 있습니다. (알고리즘 풀때 자주 보이는 편)
이때 간편하게 사용할 수 있는 파이썬 라이브러리인 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종류의 조합형 이터레이터 외에도 다양한 명령어들이 있습니다.
자세한 내용은 아래 공식문서를 참고하시면 됩니다.