Python 프로그래밍에서 두 개의 리스트가 있을 때, 첫 번째 리스트의 각 요소를 두 번째 리스트의 각 요소와 조합해야 하는 경우가 자주 발생합니다. 예를 들어, 가능한 모든 좌표 쌍을 만들거나 여러 옵션의 조합을 생성할 때 유용합니다. 이 글에서는 이러한 순열(조합)을 구하는 두 가지 대표적인 방법을 소개합니다.
방법 1: 중첩 For 루프 사용하기
가장 직관적인 방법은 중첩된 for 루프를 활용하는 것입니다. 바깥쪽 for 루프는 첫 번째 리스트를 순회하고, 안쪽 for 루프는 두 번째 리스트를 순회하면서 각 요소의 조합을 리스트에 담습니다. 파이썬의 리스트 컴프리헨션(list comprehension)을 사용하면 코드를 한 줄로 간결하게 작성할 수 있습니다.
예제 코드
A = [5, 8]
B = [10, 15, 20]
print("주어진 리스트 : ", A, B)
permutations = [[m, n] for m in A for n in B]
print("순열 결과 : ", permutations)실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
주어진 리스트 : [5, 8] [10, 15, 20] 순열 결과 : [[5, 10], [5, 15], [5, 20], [8, 10], [8, 15], [8, 20]]
리스트 A의 첫 번째 요소인 5부터 시작하여 B의 모든 요소와 차례대로 짝을 이루고, 그다음 8이 같은 방식으로 B의 모든 요소와 조합됩니다. 결과적으로 총 2 × 3 = 6개의 조합이 생성됩니다.
방법 2: itertools 모듈의 product 함수 사용하기
Python 표준 라이브러리인 itertools 모듈에는 product()라는 반복자(iterator)가 있습니다. 이 함수는 위에서 살펴본 중첩 for 루프와 정확히 동일한 작업을 수행하지만, 내부적으로 자동으로 중첩 루프를 처리해 주기 때문에 더 깔끔하고 파이써닉한 코드를 작성할 수 있습니다.
예제 코드
import itertools
A = [5, 8]
B = [10, 15, 20]
print("주어진 리스트 : ", A, B)
result = list(itertools.product(A, B))
print("순열 결과 : " + str(result))실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
주어진 리스트 : [5, 8] [10, 15, 20] 순열 결과 : [(5, 10), (5, 15), (5, 20), (8, 10), (8, 15), (8, 20)]
itertools.product()는 결과를 튜플(tuple) 형태로 반환한다는 점에 유의하세요. 리스트 형태가 필요하다면 각 튜플을 list()로 변환하면 됩니다.
두 방법의 비교 및 활용 팁
- 중첩 for 루프: 로직이 명시적이라 초보자가 이해하기 쉽고, 조건문을 추가하거나 결과 형태를 자유롭게 커스터마이징할 수 있습니다.
- itertools.product(): 코드가 간결하고 성능이 최적화되어 있으며, 세 개 이상의 리스트 조합도 손쉽게 처리할 수 있습니다. 예를 들어
itertools.product(A, B, C)처럼 인자를 추가하기만 하면 됩니다. - repeat 옵션:
itertools.product(A, repeat=2)처럼 사용하면 하나의 리스트 내에서 가능한 모든 순열(중복 포함)을 구할 수도 있습니다.
리스트가 많아지거나 조합 규모가 커질수록 itertools.product()를 사용하는 것이 가독성과 유지보수 측면에서 훨씬 유리합니다. 반면 단순한 두 리스트 조합이라면 리스트 컴프리헨션도 충분히 좋은 선택입니다.