Tiny Finger Point Hand With Heart
본문 바로가기
Python

[라이브러리/itertools] combinations , product , permutations

by yoondii 2023. 1. 17.
728x90
반응형

알고리즘을 풀다보면 조합을 구하는 문제를 많이 만나게 되는데 그럴 때 사용하기 좋은 내장함수를 보자


리스트에 있는 값들의 모든 조합을 구하기

 사용하려면 언제 사용하는지를 알아야한다.

  • 하나의 리스트에서 모든 조합을 계산을 해야 한다면, permutations, combinations을 사용
  • 두개 이상의 리스트에서 모든 조합을 계산해야 한다면, product를 사용
#맨위에 입력해주자
from itertools import combinations
from itertools import product
from itertools import permutations

 


하나의 리스트에서 모든 조합을 구하기

> combinations(조합)

itertools.combinations(iterable, r)

반복 가능 객체(iterable) 중에서 r개를 선택한 조합을 이터레이터로 리턴하는 함수이다.

순서고려 x ,중복 x

 

만약 이렇게 하나의 리스트가 주어진다면 

items = ['1', '2', '3', '4', '5']
from itertools import combinations
list(combinations(items, 2))
# [('1', '2'), ('1', '3'), ('1', '4'), ('1', '5'), ('2', '3'), ('2', '4'), ('2', '5'), ('3', '4'), ('3', '5'), ('4', '5')]

combinations은 순서를 고려하지않을 뿐, 중복은 허용하지 않기 때문에 중복되지 않게 조합이 이루어져 나온다.

같은 숫자를 허용하는 중복 조합은 itertools.combinations_with_replacement()를 사용하면 된다.


> permutations(순열)

itertools.permutations(iterable, r)은

반복 가능 객체(iterable) 중에서 r개를 선택한 순열을 이터레이터로 리턴하는 함수이다.

순서고려 o, 중복 x

 

하나의 리스트가 주어졌을 때,

items = ['1', '2', '3', '4', '5']
from itertools import permutations
list(permutations(items, 2))
# [('1', '2'), ('1', '3'), ('1', '4'), ('1', '5'), ('2', '1'), ('2', '3'), ('2', '4'), ('2', '5'), ('3', '1'), ('3', '2'), ('3', '4'), ('3', '5'), ('4', '1'), ('4', '2'), ('4', '3'), ('4', '5'), ('5', '1'), ('5', '2'), ('5', '3'), ('5', '4')]

permutations은 순서를 고려하면서 중복없이 경우의 수를 나타낸다.


두개 이상의 리스트의 모든 조합 구하기

> product

데카르트 곱이라고도 하는 cartesian product를 표현할 때 사용하는 함수이다.

(DB의 join, 관계 대수의 product를 생각하면 된다).

from itertools import product

items = [['a', 'b', 'c,'], ['1', '2', '3', '4'], ['!', '@', '#']]
list(product(*items))
# [('a', '1', '!'), ('a', '1', '@'), ('a', '1', '#'), ('a', '2', '!'), ('a', '2', '@'), ('a', '2', '#'), ('a', '3', '!'), ('a', '3', '@'), ('a', '3', '#'), ('a', '4', '!'), ('a', '4', '@'), ('a', '4', '#'), ('b', '1', '!'), ('b', '1', '@'), ('b', '1', '#'), ('b', '2', '!'), ('b', '2', '@'), ('b', '2', '#'), ('b', '3', '!'), ('b', '3', '@'), ('b', '3', '#'), ('b', '4', '!'), ('b', '4', '@'), ('b', '4', '#'), ('c,', '1', '!'), ('c,', '1', '@'), ('c,', '1', '#'), ('c,', '2', '!'), ('c,', '2', '@'), ('c,', '2', '#'), ('c,', '3', '!'), ('c,', '3', '@'), ('c,', '3', '#'), ('c,', '4', '!'), ('c,', '4', '@'), ('c,', '4', '#')]

주의할 점

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))		# []
728x90
반응형

댓글