어제 오늘 내일

[Python 기초] "표 형태의 데이터도 한 줄로!" 2차원 리스트 컴프리헨션 본문

IT/Python

[Python 기초] "표 형태의 데이터도 한 줄로!" 2차원 리스트 컴프리헨션

hi.anna 2026. 5. 24. 18:36

2차원 리스트를 만들 때 가장 흔하게 저지르는 실수가 바로 리스트 곱하기(*)를 사용하는 것입니다. 하지만 앞서 배웠듯이 이는 참조 복사 버그를 일으키죠. 리스트 컴프리헨션을 사용하면 각 행이 독립적으로 존재하는 완벽한 2차원 배열을 단 한 줄로 안전하게 만들 수 있습니다.


1. 기본 구조: 중첩 리스트 생성하기

2차원 리스트는 '리스트 안에 리스트가 들어있는 구조'입니다. 따라서 컴프리헨션 안에 또 다른 컴프리헨션을 넣어주면 됩니다.

📌 예제 코드: 3x4 크기의 0으로 채워진 행렬 만들기

rows = 3
cols = 4

# [ [안쪽 리스트] for 바깥쪽 반복문 ]
# "0을 4번 채운 리스트를 3번 만들어라!"
matrix = [[0 for _ in range(cols)] for _ in range(rows)]

print(matrix)
# 출력: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

2. 값에 규칙 부여하기

인덱스 번호를 활용하여 2차원 배열 안에 특정한 값을 채울 수도 있습니다.

📌 예제 코드: 구구단 2단부터 3단까지 리스트로 만들기

# [[결과값 for i 인덱스] for j 인덱스]
gugudan = [[j * i for i in range(1, 10)] for j in range(2, 4)]

print("2단:", gugudan[0])
print("3단:", gugudan[1])

3. 고수들의 기술: 2차원 리스트 '평탄화' (Flatten)

반대로 2차원 리스트를 다시 1차원 리스트로 쭉 펴야 할 때가 있습니다. 이때도 리스트 컴프리헨션을 쓰면 for문을 두 번 겹쳐 쓰는 것보다 훨씬 간결합니다.

📌 예제 코드: 2차원 -> 1차원 변환

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# "행(row)에서 값(val)을 꺼내는데, 그 행은 matrix에서 하나씩 가져와라"
# 주의: 바깥쪽 for문이 앞에 옵니다!
flatten = [val for row in matrix for val in row]

print(flatten)
# 출력: [1, 2, 3, 4, 5, 6, 7, 8, 9]

4. 조건문이 포함된 2차원 컴프리헨션

특정 조건에 맞는 데이터만 골라내어 2차원 리스트를 정제할 수도 있습니다.

📌 예제 코드: 2차원 리스트에서 짝수만 남기기

data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 각 행에서 짝수만 골라내어 새로운 2차원 리스트 생성
evens_only = [[x for x in row if x % 2 == 0] for row in data]

print(evens_only)
# 출력: [[2], [4, 6], [8]]

📝 핵심 요약

  1. 독립성: 리스트 컴프리헨션으로 만든 2차원 리스트는 각 행이 독립적이라서 한 곳을 수정해도 다른 곳에 영향을 주지 않습니다.
  2. 순서: 평탄화(Flatten) 시에는 바깥쪽 반복문을 먼저 쓰고 안쪽 반복문을 뒤에 씁니다. ([val for row in matrix for val in row])
  3. 가독성: 2차원 이상의 깊이(3차원 등)로 들어가면 코드가 너무 복잡해질 수 있으니, 그때는 일반적인 for문을 쓰는 것이 나을 수도 있습니다.

2차원 리스트 컴프리헨션까지 정복하셨군요! 이제 데이터를 구조적으로 생성하고 가공하는 데 거침이 없으실 겁니다.
 

반응형
Comments