두 개의 데이터 리스트 l1과 l2가 있을 때, 이 두 리스트의 데카르트 곱(Cartesian Product)을 구해야 하는 경우가 있습니다. 데카르트 곱이란 두 집합의 모든 원소들을 순서쌍으로 조합한 것으로, 예를 들어 두 리스트가 각각 (a, b)와 (c, d)라면 데카르트 곱은 {(a, c), (a, d), (b, c), (b, d)}가 됩니다.
itertools.product() 함수 활용하기
파이썬에서는 표준 라이브러리인 itertools에 포함된 product() 함수를 사용하면 데카르트 곱을 손쉽게 계산할 수 있습니다. 이 함수는 결과를 이터레이터(iterator) 형태로 반환하므로, list()> 생성자에 전달하여 리스트로 변환해 주어야 합니다.
예를 들어 입력이 l1 = [1, 5, 6], l2 = [1, 2, 9]라면 출력은 다음과 같습니다.
[(1, 1), (1, 2), (1, 9), (5, 1), (5, 2), (5, 9), (6, 1), (6, 2), (6, 9)]
해결 절차
x := product(l1, l2)— 데카르트 곱의 이터레이터를 생성합니다.ret := list(x)— 이터레이터 x를 리스트로 변환합니다.return ret— 변환된 리스트를 반환합니다.
구현 예제
아래 코드를 통해 실제 동작 방식을 확인해 보겠습니다.
from itertools import product def solve(l1, l2): return list(product(l1, l2)) l1 = [1, 5, 6] l2 = [1, 2, 9] print(solve(l1, l2))
입력
[1, 5, 6], [1, 2, 9]
출력
[(1, 1), (1, 2), (1, 9), (5, 1), (5, 2), (5, 9), (6, 1), (6, 2), (6, 9)]
이처럼 itertools.product()를 사용하면 반복문을 직접 작성하지 않고도 두 리스트의 모든 조합을 깔끔하게 얻을 수 있습니다. 참고로 세 개 이상의 리스트에도 적용할 수 있으며, repeat 인자를 활용하면 같은 리스트의 중복 조합(거듭곱)도 쉽게 생성할 수 있습니다.