combinations & permutations & product

hyyyynjn·2021년 5월 6일
0

python 정리

목록 보기
9/26
post-thumbnail
post-custom-banner

하나의 리스트에서 순열, 조합을 계산하는 경우

👉 combinations(조합 : 순서를 구분하지 않음), permutations(순열 : 순서를 구분함)

✋itertools.combinations(iterable, r)

  • iterable중에서 r개를 선택할 수 있는 조합을 이터레이터로 리턴하는 함수
  • 한 리스트에서 중복을 허용하지 않고 모든 경우의 수를 구하는 것
from itertools import combinations

items = ['1', '2', '3', '4', '5']
it = list(combinations(items, 2))
print(it)
# [('1', '2'), ('1', '3'), ('1', '4'), ('1', '5'), ('2', '3'), ('2', '4'), ('2', '5'), ('3', '4'), ('3', '5'), ('4', '5')]

print(len(it)) # 10 -> 총 경우의 수

✋itertools.combinations_with_replacement

중복을 허용하는 중복조합

from itertools import combinations_with_replacement

len(list(combinations_with_replacement(range(1, 46), 6))) # 15890700 -> 총 경우의 수

✋itertools.permutations(iterable, r=None)

  • iterable 요소의 길이 r에 해당하는 순열을 리턴한다.
  • 한 리스트에서 중복을 허용하고 모든 경우의 수를 구하는 것
from itertools import permutations

items = ['1', '2', '3', '4', '5']
print(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')]

두개 이상의 리스트에서 순열, 조합을 계산하는 경우

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

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

post-custom-banner

0개의 댓글