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 함수를 사용하는 것이 좋습니다.