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

Python – 리스트 내 튜플 리스트를 순회하는 3가지 방법


리스트(List)는 파이썬에서 가장 핵심적인 컨테이너 자료형으로, 일상적인 프로그래밍은 물론 웹 개발 영역에서도 거의 모든 코드에 등장합니다. 리스트를 자주, 많이 사용할수록 이를 능숙하게 다루는 능력이 곧 생산성으로 이어지기 때문에, 리스트의 기본 연산과 활용 패턴을 익혀두는 것이 매우 중요합니다.

이번 글에서는 '리스트 안에 튜플들이 담긴 중첩 리스트'를 하나의 리스트로 순회하며 평탄화(flatten)하는 대표적인 세 가지 방법을 예제 코드와 함께 살펴보겠습니다.

방법 1. itertools.zip_longest + 리스트 컴프리헨션

itertools 모듈의 zip_longest()는 여러 개의 리스트를 인덱스별로 묶어주는 함수입니다. 언패킹 연산자(*)와 함께 사용하면 각 하위 리스트의 같은 위치에 있는 요소들을 차례로 꺼낼 수 있습니다.

# itertools.zip_longest 사용
from itertools import zip_longest

# 초기 리스트 선언
test_list = [
    [('11'), ('12'), ('13')],
    [('21'), ('22'), ('23')],
    [('31'), ('32'), ('33')]
]

# 초기 리스트 출력
print("Initial List = ", test_list)

# 리스트 속 튜플 리스트를 하나의 리스트로 순회
res_list = [item for my_list in zip_longest(*test_list)
            for item in my_list if item]

# 결과 리스트 출력
print("Resultant List = ", res_list)

방법 2. zip_longest + lambda + chain 조합

같은 zip_longest()를 활용하되, chain()으로 묶인 결과를 한 줄로 펼친 뒤 filter()lambda를 이용해 빈 값(None)을 걸러내는 방식입니다. 함수형 프로그래밍 스타일을 선호하는 경우 유용하게 쓸 수 있습니다.

# itertools.zip_longest + lambda + chain 사용
from itertools import zip_longest, chain

# 초기 리스트 선언
test_list = [
    [('11'), ('12'), ('13')],
    [('21'), ('22'), ('23')],
    [('31'), ('32'), ('33')]
]

# 초기 리스트 출력
print("Initial List = ", test_list)

# lambda + chain + filter로 리스트 속 튜플 리스트 순회
res_list = list(filter(lambda x: x, chain(*zip_longest(*test_list))))

# 결과 리스트 출력
print("Resultant List = ", res_list)

방법 3. 리스트 컴프리헨션만 사용하기

별도의 라이브러리 없이 가장 단순하고 파이썬답게 해결하는 방법입니다. 이중 for 문을 리스트 컴프리헨션 한 줄로 표현해 중첩 리스트를 그대로 펼칩니다.

# 리스트 컴프리헨션 사용

# 초기 리스트 선언
test_list = [
    [('11'), ('12'), ('13')],
    [('21'), ('22'), ('23')],
    [('31'), ('32'), ('33')]
]

# 초기 리스트 출력
print("Initial List = ", test_list)

# 리스트 컴프리헨션으로 리스트 속 튜플 리스트 순회
res_list = [item for list2 in test_list for item in list2]

# 결과 리스트 출력
print("Resultant List = ", res_list)

실행 결과 비교

세 방법 모두 정상적으로 동작하지만, 요소가 나열되는 순서에는 차이가 있다는 점에 유의해야 합니다.

  • 방법 1, 2 (zip_longest 기반): 각 리스트의 같은 위치 요소부터 교차적으로 추출합니다.
    ['11', '21', '31', '12', '22', '32', '13', '23', '33']
  • 방법 3 (단순 컴프리헨션): 하위 리스트를 앞에서부터 순서대로 펼칩니다.
    ['11', '12', '13', '21', '22', '23', '31', '32', '33']

따라서 열(column) 단위로 데이터를 재배열하고 싶다면 zip_longest를, 단순히 행(row) 순서대로 평탄화하고 싶다면 리스트 컴프리헨션을 선택하는 것이 좋습니다.