본문 바로가기

프로그래밍/파이썬

[파이썬] 리스트 컴프리헨션(list comprehension)의 이해

0. 들어가기 앞서



행(row)을 만나기 위해서는 matrix의 괄호를 한 번 벗겨야 한다.

행의 원소(element)들을 만나기 위해서는 matrix의 괄호를 두 번 벗겨야 한다.


한 번 벗기기 위해서는 for문을 한 번만 사용하면 되고

두 번 벗기기 위해서는 for문을 두 번 사용하면 된다.


1. row 내의 element 접근하기

리스트 컴프리헨션은 여러 가지 표현식이 있어서 더 어려운 듯 하다.

여기서 element란 하나하나의 원소를 의미한다고 정의하자.

간단하게 표현하면(?) 위와 같이 얘기할 수 있다.

 for문은 →로 진행되며, 괄호를 한꺼풀식 벗긴다고 생각하면 된다. 


 그래서 첫번째 for문에서 원 데이터(matrix)가 가장 먼저 등장하게 되며

 한꺼풀식 벗긴 데이터를 또 한꺼풀 벗긴다고 생각하면 된다.


 다시 말하지만, 괄호를 1번 벗기려면 for문을 1번, 괄호를 2번 벗기려면 for문을 2번 벗기면 된다.

 그러면 괄호가 3개인 예제를 만나보자.


  1. matrix = [[[1,2,3], [4,5,6], [7,8,9]], [['a','b','c'], ['d', 'e', 'f']]]
  2.  
  3. # 괄호 1번 벗기기
  4. print("괄호 한 번 벗기기")
  5. sub_matrix = [row for row in matrix]
  6. print("matrix_sub_matrix :", sub_matrix)
  7.  
  8. # 괄호 2번 벗기기
  9. print("괄호 두 번 벗기기")
  10. sub_matrix_list = [row_element for row in matrix for row_element in row]
  11. print("matrix_sub_matrix_list : ", sub_matrix_list)
  12.  
  13. # 괄호 3번 벗기기
  14. print("괄호 세 번 벗기기")
  15. sub_matrix_list_element = [element for sub_matrix in matrix
  16.                                    for sub_matrix_list in sub_matrix
  17.                                    for element in sub_matrix_list]
  18.  
  19. print("matrix_sub_matrix_list_element : ", sub_matrix_list_element)

matrix = [[[1,2,3], [4,5,6], [7,8,9]], [['a','b','c'], ['d', 'e', 'f']]] 

matrix 내에 또 다른 매트릭스(sub_matrix)가 2개 있는 걸로 이해할 수 있다.


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

sub_matrix_2 = [['a','b','c'], ['d','e','f']] 가 있는 형태이다.


sub_matrix_1과 sub_matrix_2의 괄호를 또 한번 벗기면

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

sub_matrix_list_2 = ['a','b','c'], ['d', 'e', 'f'] 를 만나게 된다.


sub_matrix_list_1과 sub_matrix_list_2의 괄호를 또 한번 벗기게 되면 드디어 리스트를 구성하는 원소(element)를 만날 수 있다.

sub_matrix_list_element_1 = 1,2,3,4,5,6,7,8,9

sub_matrix_list_element_2 = 'a', 'b', 'c', 'd', 'e', 'f'


천천히 로직을 이해하도록 하자!


2. 리스트를 살리면서 element 접근하기


공부를 하다보면, 매트릭스 내에 위치한 리스트들에 대해 계산을 해야 할 필요가 있다.

다중 리스트, 즉 리스트 안에 리스트를 만들어보자


그런데 이게 굉장히 헷갈린다. 1번 예제에서는 괄호를 한번만 써서 해결이 가능했는데, 여기서는 두번 써야 한다.

타이핑은 왼쪽에서 오른쪽으로 해야하는데  진행방향은 반대로 느껴진다. 


느낌을 잘 이해하자. 가장 먼저 오는 값들은 '내가 계산하고 싶은 식 + 저장하고 싶은 형태'를 의미한다.

이때, 괄호를 두 번 벗겨야 각 element에 접근할 수 있기 때문에 가장 작은 단위인 element가 와야 한다.


3. 정리


원소에 대해서만 뽑아내고 싶으면, 대괄호를 하나만 써서 해결이 가능하다.

단, 리스트에 대한 계산이 필요할 때는 대괄호를 두 번 써서 해결이 가능하다.

물론 중괄호가 몇 번 등장하느냐에 따라서 for문의 개수는 달라질 수 있다 



물론, 리스트 컴프리헨션에서 표현식이 두 개 이상 있으면 이해하기 매우 어려우므로 피하라고 권장한다.

(파이썬 코딩의 기술, 브렛 슬라킨)


그래도 익숙해지면 굉장히 편한 상태로 유연한 사고가 가능해지고

이를 이해하느냐, 이해하지 않느냐는 앞으로 중요한 자산이 될 듯 싶어서 꾸역꾸역 이해하려고 노력해보았다.