파이썬 프로그래밍을 하다 보면 요소가 튜플(tuple)로 구성된 리스트를 다루게 되는 경우가 있습니다. 하지만 이후 데이터 처리 과정에서는 튜플을 풀어서 일반적인 리스트 요소로 변환해야 할 때가 많습니다. 이 글에서는 튜플 리스트를 하나의 평탄화된(flattened) 리스트로 변환하는 대표적인 세 가지 방법을 예제와 함께 살펴보겠습니다.
1. 리스트 컴프리헨션(List Comprehension) 활용
가장 직관적인 방법입니다. 중첩된 for 루프를 컴프리헨션으로 작성하여 각 튜플 내부의 요소를 하나씩 꺼내고, 이를 최종 리스트로 구성합니다.
예제
listA = [('Mon', 3), ('Wed', 4), ('Fri', 7, 'pm')]
# 주어진 리스트
print("Given list : \n", listA)
res = [item for t in listA for item in t]
# 결과 출력
print("Final list: \n", res)실행 결과
위 코드를 실행하면 아래와 같은 결과를 얻을 수 있습니다.
Given list :
[('Mon', 3), ('Wed', 4), ('Fri', 7, 'pm')]
Final list:
['Mon', 3, 'Wed', 4, 'Fri', 7, 'pm']각 튜플의 길이가 달라도(위 예제의 세 번째 튜플처럼) 문제없이 동작한다는 점이 장점입니다.
2. itertools.chain() 활용
itertools 모듈의 chain 메서드에 * 연산자(언패킹)를 함께 사용하면, 튜플 리스트의 각 요소를 개별 인자로 전달하여 하나의 연속된 시퀀스로 연결할 수 있습니다. 이후 list()로 감싸면 최종 리스트가 완성됩니다.
예제
import itertools
listA = [('Mon', 3), ('Wed', 4), ('Fri', 7, 'pm')]
# 주어진 리스트
print("Given list : \n", listA)
res = list(itertools.chain(*listA))
# 결과 출력
print("Final list: \n", res)실행 결과
위 코드를 실행하면 아래와 같은 결과를 얻을 수 있습니다.
Given list :
[('Mon', 3), ('Wed', 4), ('Fri', 7, 'pm')]
Final list:
['Mon', 3, 'Wed', 4, 'Fri', 7, 'pm']대용량 데이터를 처리할 때는 반복문보다 C 레벨에서 구현된 itertools가 더 나은 성능을 보여주는 경우가 많습니다.
3. reduce와 concat 활용
functools 모듈의 reduce 함수에 operator 모듈의 concat 함수를 적용하면, 리스트의 각 튜플이 순차적으로 이어 붙여지면서 최종적으로 모든 요소를 포함하는 하나의 리스트가 생성됩니다.
예제
import operator
from functools import reduce
listA = [('Mon', 3), ('Wed', 4), ('Fri', 7, 'pm')]
# 주어진 리스트
print("Given list : \n", listA)
res = list(reduce(operator.concat, listA))
# 결과 출력
print("Final list: \n", res)실행 결과
위 코드를 실행하면 아래와 같은 결과를 얻을 수 있습니다.
Given list :
[('Mon', 3), ('Wed', 4), ('Fri', 7, 'pm')]
Final list:
['Mon', 3, 'Wed', 4, 'Fri', 7, 'pm']마무리: 어떤 방법을 선택해야 할까?
세 가지 방법 모두 동일한 결과를 반환하지만, 상황에 따라 선택 기준이 달라집니다. 리스트 컴프리헨션은 가독성이 좋아 소규모 코드에 적합하고, itertools.chain은 대량의 데이터를 효율적으로 처리할 때 유리합니다. reduce + concat 방식은 함수형 스타일을 선호하는 경우에 유용하지만, 요소 수가 많아질수록 반복적인 연결 연산으로 인해 성능이 떨어질 수 있으므로 참고하시기 바랍니다.