Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 두 리스트의 데카르트 곱(Cartesian Product) 구하는 방법

두 개의 데이터 리스트 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 인자를 활용하면 같은 리스트의 중복 조합(거듭곱)도 쉽게 생성할 수 있습니다.