데이터 분석을 하다 보면 Python에서 제공하는 다양한 자료구조를 조합해서 사용해야 하는 경우가 자주 있습니다. 예를 들어 리스트 안에 튜플을 요소로 담는 식으로 복합적인 구조를 만들 수 있는데, 이때 튜플 내부의 각 요소를 다른 값과 짝지어 새로운 (요소, 값) 쌍의 리스트를 만들어야 할 때가 있습니다.
이 글에서는 튜플을 포함한 리스트에서 각 요소를 특정 값과 결합하여 새로운 튜플 리스트를 생성하는 두 가지 방법을 소개합니다.
방법 1: for 루프(리스트 컴프리헨션) 사용
가장 직관적인 방법은 반복문을 활용하는 것입니다. 리스트 컴프리헨션 안에서 이중 for 루프를 돌면서, 튜플의 리스트 부분에 있는 각 요소를 나머지 요소(예: 요일 문자열)와 하나씩 짝지어 줍니다.
예제 코드
Alist = [([2, 8, 9], 'Mon'), ([7, 5, 6], 'Wed')]
# 주어진 튜플 리스트
print("List of tuples : \n", Alist)
# 튜플 리스트의 요소들을 결합
res = [(t1, t2) for i, t2 in Alist for t1 in i]
# 결과 출력
print("The list tuple combination : \n", res)실행 결과
위 코드를 실행하면 아래와 같은 결과를 얻을 수 있습니다.
List of tuples : [([2, 8, 9], 'Mon'), ([7, 5, 6], 'Wed')] The list tuple combination : [(2, 'Mon'), (8, 'Mon'), (9, 'Mon'), (7, 'Wed'), (5, 'Wed'), (6, 'Wed')]
리스트 [2, 8, 9]의 각 숫자가 'Mon'과, [7, 5, 6]의 각 숫자가 'Wed'와 차례대로 짝을 이루는 것을 확인할 수 있습니다.
방법 2: itertools.product 사용
Python 표준 라이브러리인 itertools 모듈에는 전달받은 인자들의 데카르트 곱(Cartesian product)을 생성해 주는 product라는 이터레이터가 있습니다. 이를 활용하면 반복 로직을 더 간결하고 파이썬답게 표현할 수 있습니다.
아래 예제에서는 각 튜플의 리스트 요소와 나머지 단일 값을 product에 넘겨 모든 가능한 쌍을 만들어냅니다.
예제 코드
from itertools import product
Alist = [([2, 8, 9], 'Mon'), ([7, 5, 6], 'Wed')]
# 주어진 튜플 리스트
print("List of tuples : \n", Alist)
# product를 이용해 튜플 리스트의 요소들을 결합
res = [x for i, j in Alist for x in product(i, [j])]
# 결과 출력
print("The list tuple combination : \n", res)실행 결과
위 코드 역시 동일한 결과를 출력합니다.
List of tuples : [([2, 8, 9], 'Mon'), ([7, 5, 6], 'Wed')] The list tuple combination : [(2, 'Mon'), (8, 'Mon'), (9, 'Mon'), (7, 'Wed'), (5, 'Wed'), (6, 'Wed')]
정리
두 방법 모두 같은 결과를 만들지만 상황에 따라 선택 기준이 달라집니다. 간단한 변환에는 리스트 컴프리헨션이 충분하고, 여러 개의 리스트를 조합하거나 더 복잡한 곱 연산이 필요할 때는 itertools.product가 코드 가독성과 확장성 면에서 유리합니다. 데이터 전처리 과정에서 레이블과 값의 쌍을 만들거나 카테고리별 매핑 데이터를 생성할 때 이 패턴을 유용하게 활용할 수 있습니다.