itertools (순열, 조합)

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)) # []