Programming/Python
Python - Product vs Permutations vs Combinations
wave35
2024. 8. 18. 00:35
itertools 모듈은 product(곱집합), permutations(순열), combinations(조합)의
반복 가능한 객체를 생성하는 데 유용한 함수들을 제공합니다.
이 모듈의 함수들은 모두 리스트나 튜플 같은 iterable 객체의 요소들을 다양한 방식으로 조합해줍니다.
각각의 함수가 어떻게 다른지 살펴보겠습니다.
1. itertools.product
- Cartesian product(곱집합)를 계산합니다.
- 입력된 모든 iterable 객체의 가능한 모든 조합을 생성합니다.
- 각 iterable의 요소가 주어진 순서대로 선택하므로 순서를 보장합니다.
from itertools import product
result = list(product([1, 2, 1], ['a', 'b']))
print(result)
# 출력: [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (1, 'a'), (1, 'b')]
용도 :
두 개 이상의 집합에 대해 모든 가능한 조합을 생성해야 할 때 사용합니다.
2. itertools.permutations
- 주어진 iterable에서 요소의 모든 가능한 순열을 생성합니다.
- 순서가 보장됩니다.
- 길이가 주어지지 않으면 순열의 길이는 기본적으로 원본 iterable과 동일합니다.
- 요소의 중복이 가능합니다.
예시)
from itertools import permutations
result = list(permutations([1, 2, 3]))
print(result)
# 출력: [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
# 길이가 주어질 때
result2 = list(permutations([1, 2, 3], 2))
# 출력: [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
용도:
주어진 요소들의 모든 순서를 계산하거나, 모든 가능성 중 특정 순서를 찾고자 할 때 사용합니다.
3. itertools.combinations
- 주어진 iterable에서 요소의 모든 가능한 조합을 생성합니다.
- 순서가 보장되지 않습니다.
- 주어진 길이만큼의 조합을 생성합니다.
- 중복 없이 각 조합을 반환합니다.
예시)
from itertools import combinations
result = list(combinations([1, 2, 3], 2))
print(result)
# 출력: [(1, 2), (1, 3), (2, 3)]
용도:
순서를 고려하지 않고 가능한 모든 조합을 계산하고자 할 때 사용합니다.
중복에 대하여
itertools.combinations 함수는 중복을 허용하지 않는 조합을 생성합니다.
여기서 "중복"은 동일한 위치의 두 요소가 같은 경우를 의미합니다.
만약에 입력된 리스트에 중복된 요소가 있는 경우,
이 요소들로 인해 결과에 동일한 조합이 여러 번 나타날 수 있습니다.
예제)
from itertools import combinations
# 예시 1: [1, 2, 3, 2]로부터 2개 조합 생성
result = list(combinations([1, 2, 3, 2], 2))
print(result)
# 출력 : [(1, 2), (1, 3), (1, 2), (2, 3), (2, 2), (3, 2)]
위의 예제와 같이 [1, 2, 3, 2]에서 첫번째 2는 두번째 2와 동일한 값이지만,
서로 다른 위치에 있기 때문에 combinations는 이들을 구별된 요소로 처리합니다.
따라서 같은 조합이 여러 번 나올 수 있으며,
이 때문에 입력 리스트에서 중복을 제거한 후 combinations 함수를 사용하는 것이 좋습니다.