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)) # []
permutation 오타, permutation 경우의 수 계산식 틀림, product 출력 내용 주석 틀림.
잘 보고 갑니다.