2021. 6. 30. 12:11ㆍ파이썬/파이썬 일반 꿀팁
파이썬으로 코딩할 때, 종종 순열, 조합을 구현할 때가 많다. 이럴 때 일일이 여러 반복문을 사용해서 구현하지 말고 표준 라이브러리인 itertools를 사용하자.
ㅇ combinations
조합을 표현할 때 사용되는 메소드이다. 한 리스트에서 중복을 허용하지 않고 모든 경우의 수를 구하는 것이다. 반환되는 항목의 수는 n! / r! / (n - r)!이다. 사용법은 다음과 같다.
- 예시)
from itertools import combinations _list = [1, 2, 3]
combi = list(combinations(_list, 2))
print(combi) # [(1, 2), (1, 3), (2, 3)] # 갯수 별로 조합을 반복할 수 있다.
for i in range(1, len(_list) + 1):
print(list(combinations(_list, i))) # [(1,), (2,), (3,)] # [(1, 2), (1, 3), (2, 3)] # [(1, 2, 3)]
ㅇ permutations
순열을 표현할 때 사용되는 메소드이다. 한 리스트에서 중복을 허용하고 모든 경우의 수를 구하는 것이다. 반환되는 항목의 수는 n! / r!이다.
- 예시)
from itertools import permutaions
_list = [1, 2, 3]
perm = list(permutations(_list, 2))
print(perm) # [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
ㅇ product
데카르트 곱이라고도 하는 cartesian product를 표현할 때 사용하는 메소드이다(DB의 join, 관계 대수의 product를 생각하면 된다). 이 메소드의 특징은 두 개 이상의 리스트의 모든 조합을 구할 때 사용된다.
- 예시)
from itertools import product
_list = ["012", "abc", "!@#"]
pd = list(product(*_list))
# [('0', 'a', '!'), ('0', 'a', '@'), ('0', 'b', '!'), ('0', 'b', '@'), ('1', 'a', '!'), ('1', 'a', '@'), ('1', 'b', '!'), ('1', 'b', '@')]
ㅇ 주의할 점
combinations, permutations, product 세 메소드 모두 generator이기 때문에 list()로 캐스팅하여 다른 곳에 저장 해두지 않으면 한 번의 루핑 이후 사라지게 된다.
from itertools import combinations
_list = range(4)
combi = combinations(_list, 2)
print(list(combi)) # [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
print(list(combi)) # []
'파이썬 > 파이썬 일반 꿀팁' 카테고리의 다른 글
리스트 순서 유지하면서 중복 제거 방법 (0) | 2022.05.12 |
---|---|
딕셔너리를 활용해서 변수 생성 (0) | 2022.04.05 |
반복문에서 zip 활용 (0) | 2021.06.01 |
중복되는 데이터 확인 (set) (0) | 2021.06.01 |
map 함수 사용하기 (0) | 2021.04.27 |