Python 순열, 조합, product - itertools

hyukim·2020년 9월 6일
3

Python 101

목록 보기
10/10

Python itertools

파이썬으로 코딩할 때, 종종 순열, 조합, product를 구현하거나 사용해야 할 때가 있다. 이럴 때 힘들게 구현하지 말고 파이썬에서 만들어둔 표준 라이브러리인 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))		# []

Reference

https://docs.python.org/ko/3/library/itertools.html

profile
💪 🥩 🍺 ✈ 💻

1개의 댓글

comment-user-thumbnail
2022년 4월 23일

permutation 오타, permutation 경우의 수 계산식 틀림, product 출력 내용 주석 틀림.
잘 보고 갑니다.

답글 달기