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

파이썬 중첩 리스트 컴프리헨션 완벽 가이드: 행렬 생성부터 평탄화까지

중첩 리스트(nested list)란 리스트 안에 또 다른 리스트가 포함된 구조를 말합니다. 파이썬은 이러한 중첩 리스트를 우아하게 다룰 수 있는 다양한 기능을 제공하며, 그중에서도 리스트 컴프리헨션(list comprehension)은 중첩 리스트를 생성하고 조작하는 가장 간결하고 파이썬다운 방법입니다.

이 글에서는 리스트 컴프리헨션을 활용해 중첩 리스트를 만들고, 필터링하고, 평탄화하는 방법을 실제 예제와 함께 살펴보겠습니다.

1. 행렬(Matrix) 생성하기

행렬을 만든다는 것은 여러 개의 행과 열로 이루어진 2차원 데이터를 구성하는 것을 의미합니다. 리스트 컴프리헨션 안에 for 반복문을 포함한 리스트를 한 번 더 감싸면, 바깥쪽 반복문은 행을, 안쪽 반복문은 열을 담당하며 손쉽게 행렬을 만들 수 있습니다.

예제

matrix = [[m for m in range(4)] for n in range(3)]
print(matrix)

위 코드를 실행하면 다음과 같은 결과가 출력됩니다:

[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

바깥쪽 for n in range(3)이 3개의 행을 만들고, 각 행마다 안쪽 컴프리헨션이 0부터 3까지의 값을 가진 리스트를 생성하여 3×4 크기의 행렬이 완성됩니다.

2. 중첩 리스트에서 조건으로 필터링하기

리스트 컴프리헨션에는 if 조건문을 추가할 수 있습니다. 중첩 리스트를 순회하면서 특정 조건을 만족하는 요소만 골라내는 필터링 기능도 자연스럽게 구현할 수 있습니다.

아래 예제는 12개월 이름이 월 단위로 나뉘어 저장된 2차원 리스트에서, 이름 길이가 5자 이하인 달만 추출하는 코드입니다.

예제

years = [['January', 'February', 'March'], ['April', 'May', 'June'], ['July', 'August', 'September'],['October','November','December']]
# if 조건이 포함된 중첩 리스트 컴프리헨션
years = [month for sublist in years for month in sublist if len(month) <= 5]
print(years)

위 코드를 실행하면 다음과 같은 결과가 출력됩니다:

['March', 'April', 'May', 'June', 'July']

먼저 바깥쪽 반복문으로 각 하위 리스트(sublist)를 꺼내고, 안쪽 반복문으로 개별 요소를 하나씩 확인한 뒤, len(month) <= 5 조건을 통과한 값만 새 리스트에 담게 됩니다.

3. 중첩 리스트 평탄화(Flattening)하기

평탄화란 여러 겹으로 중첩된 리스트를 하위 리스트 없이 요소만 일렬로 늘어선 단일 리스트로 변환하는 작업입니다. 리스트 컴프리헨션을 사용하면 복잡한 반복문 없이 단 한 줄로 처리할 수 있습니다.

예제

nested_list = [[1] ,[17, 19], [21,23,25], [32,35,37,39]]
# 2차원 리스트를 1차원으로 평탄화하는 중첩 리스트 컴프리헨션
flattened_list = [value for sublist in nested_list for value in sublist]
print(flattened_list)

위 코드를 실행하면 다음과 같은 결과가 출력됩니다:

[1, 17, 19, 21, 23, 25, 32, 35, 37, 39]

바깥쪽 반복문이 각 하위 리스트를 순서대로 가져오면, 안쪽 반복문이 그 안의 모든 값을 차례로 꺼내 하나의 리스트에 이어 붙입니다. 결과적으로 4개의 하위 리스트가 하나의 1차원 리스트로 합쳐졌습니다.

마무리

중첩 리스트 컴프리헨션은 행렬 생성, 조건 필터링, 평탄화 같은 작업을 짧고 읽기 쉬운 코드로 처리할 수 있는 강력한 도구입니다. 다만 중첩이 깊어질수록 가독성이 떨어질 수 있으므로, 로직이 복잡해지는 경우에는 일반적인 for 반복문이나 itertools.chain() 같은 표준 라이브러리 활용도 함께 고려해 보시기 바랍니다.