일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- itertools
- FOREIGN KEY
- 네이밍
- python
- project euler
- 자료구조
- Dictionary
- BOJ
- 파이썬
- floor
- datetime
- mysql
- convention
- 에라토스테네스의 체
- 외래키
- lower_case_table_names
- 큰 수 나누기
- enumerate
- timestamp
- 리스트 컴프리헨션
- Codeforces
- SUM()
- 딕셔너리
- 소수
- list comprehension
- 2557
- SUM
- 세그먼트 트리
- ceil
- flask
- Today
- Total
늒네 기록
[python] product, permutations, combinations 함수에 대하여 본문
코드를 짜다 보면 종종 주어진 선택지들 중에 몇 개를 선택해서 조합을 만들고, 그 조합들을 가지고 계산을 돌려야 할 일이 있을 때가 있다. 예를 들어,
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
l = ['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번 문제를 푸는 데에 매우 유용하게 활용할 수 있다.
'언어 공부 기록 > python' 카테고리의 다른 글
[python] zip() 함수에 대하여 (0) | 2020.10.09 |
---|---|
[python] lambda와 reduce의 활용을 통한 리스트 아이템의 곱 구하기 (0) | 2020.10.01 |
[python] eval()함수에 대하여 (0) | 2020.09.30 |
[python] enumerate()함수에 대하여 (0) | 2020.09.26 |
[python] sum() 함수에 대하여 (0) | 2020.09.24 |