본문 바로가기

프로그래밍/파이썬

[파이썬] 행렬(matrix)과 리스트 컴프리헨션(list comprehension) 이해하기

0. 들어가기 앞서

이번 포스팅에서는 행렬(matrix)에서 리스트 컴프리헨션(list comprehension)을 이용해 행과 열을 뽑아내도록 하겠다.

여러 시행착오를 거치면서 삽질했던거라 까먹지 않기 위해 포스팅한다.


아주 얕은 깊이의 내용만을 다루며 많은 오류가 예상된다.

포스팅에 오류가 있다면 적극적으로 말씀해주세요!


1. 행렬 표현식 이해하기

행렬에 대해 공부할 때 가장 헷갈리는 게 행(row)과 열(col)이라는 용어를 이해하는 것이다.

행은 가로줄을 의미하고, 열은 세로줄을 의미한다.

나는 행과 열을 이해하는 데 힘들었다. 아무튼 힘들었다.



2. 행렬의 행(row)과 열(column) 이해하기

행렬은 위 그림처럼 표현할 수 있다

행(row) 한 줄은 괄호 하나를 벗기면 되고,

행(row) 한 줄에 속해있는원소들은 괄호 두 개를 벗기면 된다.



여기서 같은 열(column)에 있는 원소들을 뽑아내려면 행(row)의 '위치★'가 같으면 된다.

이를 이용해서 행을 한 번 뽑아보고, 열을 한 번 뽑아보는 코드를 작성할 것이다.


3. 행렬의 행(row)과 열(column)을 for문으로 접근하기


  1. matrix = [[1,2,3], [4,5,6], [7,8,9]]
  2.  
  3. result_row = []
  4. for row in range(0, len(matrix)): # 행 뽑기
  5.     result_row.append(matrix[row])
  6. print(result_row)
  7. >>> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  8.  
  9. result_col = []
  10. for row in zip(*matrix):            # 열 뽑기
  11.     result_col.append(row)
  12. print(result_col)
  13. >>> [(1, 4, 7), (2, 5, 8), (3, 6, 9)]


4. 행렬의 행(row)과 열(column)을 list comprehension으로 접근하기

행과 열을 뽑기 위해서 한 줄로 압축(comprehension) 할 수 있는 강력한 코드가 있다.


  1. result_row = [row for row in matrix]
  2. result_col = [[col for col in matrix] for matrix in zip(*matrix)


행을 뽑을 때는 그나마 이해하기 쉽지만

열을 뽑을 때는 zip이라는 특이한 함수를 써줘야 한다.



zip 함수는 여러 시퀀스(sequence)들을 순회하면서 데이터들을 모으는 함수라고 보면 된다.

좀 더 심화하면  *(애스터리스크, asterisk)는 가변 인자를 의미하기도 하지만 unpacking(풀어헤침)을 의미하기도 한다


여기서는 리스트 형태의 컨테이너(container)의 값들을 unpacking해서 result_col = [ ] 이라는 리스트에 저장하게 된다.


그리고 zip함수는 튜플의 형태로 반환을 하게 된다.

print(type(row)를 하면 <class 'tuple'> 이 반환되는 것을 알 수 있다.

다시 list(row)를 해주면 리스트 형태로 바꿔줄 수 있음을 기억하자.