👉
combinations
(조합 : 순서를 구분하지 않음),permutations
(순열 : 순서를 구분함)
- 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 -> 총 경우의 수
중복을 허용하는 중복조합
from itertools import combinations_with_replacement
len(list(combinations_with_replacement(range(1, 46), 6))) # 15890700 -> 총 경우의 수
- 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를 생각하면 된다)
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)) # []