늒네 기록

[python] product, permutations, combinations 함수에 대하여 본문

언어 공부 기록/python

[python] product, permutations, combinations 함수에 대하여

jaeha lee 2020. 10. 1. 16:55

코드를 짜다 보면 종종 주어진 선택지들 중에 몇 개를 선택해서 조합을 만들고, 그 조합들을 가지고 계산을 돌려야 할 일이 있을 때가 있다. 예를 들어,

 

A, B, C, D 선택지가 있을때, 이 중에서

i) 중복을 허용하여 두 개를 순서대로 뽑아서 나열한다

-> AA, AB, AC, AD, BA, BB, BC, BD, CA, CB, CC, CD, DA, DB, DC, DD

ii) 중복을 허용하지 않고 두 개를 순서대로 뽑아서 나열한다

->AB, AC, AD, BA, BC, BD, CA, CB, CD, DA, DB, DC

iii) 중복을 허용하지 않고 두 개를 뽑는다. 순서가 달라도 조합이 같으면 같은 걸로.

->AB, AC, AD, BC, BD, CD

 

이때 위의 i), ii), iii) 상황에서 각각 파이썬에 내장된 itertools 패키지의 함수를 가져다가 사용하면 된다.

1
2
3
4
5
6
7
8
9
10
11
from itertools import product, permutations, combinations
 
= ['A''B''C''D']
 
print(product(l,repeat=2)) # <itertools.product object at 0x01E2E0A8> 
print(permutations(l,2)) # <itertools.permutations object at 0x01E17668>
print(combinations(l,2)) # <itertools.combinations object at 0x01E17668>
 
print(list(product(l,repeat=2))) # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('B', 'D'), ('C', 'A'), ('C', 'B'), ('C', 'C'), ('C', 'D'), ('D', 'A'), ('D', 'B'), ('D', 'C'), ('D', 'D')]
print(list(permutations(l,2))) # [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'A'), ('B', 'C'), ('B', 'D'), ('C', 'A'), ('C', 'B'), ('C', 'D'), ('D', 'A'), ('D', 'B'), ('D', 'C')]
print(list(combinations(l,2))) # [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]
cs

해당 함수들을 불러와서 쓰면 각각 itertools.product, itertools.permutations, itertools.combinations 오브젝트를 리턴하는 것을 확인할 수 있고, 이를 리스트로 변환해서 출력해보면 각각의 조합이 튜플 형태로 저장되어있는 것을 확인할 수 있다.

 

좀 더 다양한 함수들과 설명들은 파이썬 공식 문서에서 확인이 가능하다.

https://docs.python.org/3.8/library/itertools.html

 

이 함수들을 직접 구현해서 쓰는 귀찮은 작업을 거치지 않아도 바로 활용할 수 있는 것이 정말 큰 장점이라고 볼 수 있다. 물론 리스트의 크기가 커지고 뽑아야 하는 아이템 개수가 많아질 경우 n!의 속도로 전체 결과물의 수가 많아지므로, 이를 전부 iterate해야 하는 로직이 있을 경우 처음부터 접근을 잘 한 것이 맞는지 다시 생각해보는 것이 좋을 수도 있다.

 

위 세 가지 함수들은 프로젝트 오일러 93번 문제를 푸는 데에 매우 유용하게 활용할 수 있다.

 

반응형
Comments