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

Python에서 튜플 리스트를 일반 리스트로 변환하는 3가지 방법

파이썬 프로그래밍을 하다 보면 요소가 튜플(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 방식은 함수형 스타일을 선호하는 경우에 유용하지만, 요소 수가 많아질수록 반복적인 연결 연산으로 인해 성능이 떨어질 수 있으므로 참고하시기 바랍니다.