0. 들어가기 앞서
행(row)을 만나기 위해서는 matrix의 괄호를 한 번 벗겨야 한다.
행의 원소(element)들을 만나기 위해서는 matrix의 괄호를 두 번 벗겨야 한다.
한 번 벗기기 위해서는 for문을 한 번만 사용하면 되고
두 번 벗기기 위해서는 for문을 두 번 사용하면 된다.
1. row 내의 element 접근하기
리스트 컴프리헨션은 여러 가지 표현식이 있어서 더 어려운 듯 하다.
여기서 element란 하나하나의 원소를 의미한다고 정의하자.
간단하게 표현하면(?) 위와 같이 얘기할 수 있다.
for문은 →로 진행되며, 괄호를 한꺼풀식 벗긴다고 생각하면 된다.
그래서 첫번째 for문에서 원 데이터(matrix)가 가장 먼저 등장하게 되며
한꺼풀식 벗긴 데이터를 또 한꺼풀 벗긴다고 생각하면 된다.
다시 말하지만, 괄호를 1번 벗기려면 for문을 1번, 괄호를 2번 벗기려면 for문을 2번 벗기면 된다.
그러면 괄호가 3개인 예제를 만나보자.
- matrix = [[[1,2,3], [4,5,6], [7,8,9]], [['a','b','c'], ['d', 'e', 'f']]]
- # 괄호 1번 벗기기
- print("괄호 한 번 벗기기")
- sub_matrix = [row for row in matrix]
- print("matrix_sub_matrix :", sub_matrix)
- # 괄호 2번 벗기기
- print("괄호 두 번 벗기기")
- sub_matrix_list = [row_element for row in matrix for row_element in row]
- print("matrix_sub_matrix_list : ", sub_matrix_list)
- # 괄호 3번 벗기기
- print("괄호 세 번 벗기기")
- sub_matrix_list_element = [element for sub_matrix in matrix
- for sub_matrix_list in sub_matrix
- for element in sub_matrix_list]
- 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문의 개수는 달라질 수 있다
물론, 리스트 컴프리헨션에서 표현식이 두 개 이상 있으면 이해하기 매우 어려우므로 피하라고 권장한다.
(파이썬 코딩의 기술, 브렛 슬라킨)
그래도 익숙해지면 굉장히 편한 상태로 유연한 사고가 가능해지고
이를 이해하느냐, 이해하지 않느냐는 앞으로 중요한 자산이 될 듯 싶어서 꾸역꾸역 이해하려고 노력해보았다.
'프로그래밍 > 파이썬' 카테고리의 다른 글
[파이썬] 클로져(Closure) 이해하기 (1) | 2017.05.20 |
---|---|
[파이썬] 일등 함수(first-class citizen) 이란? (2) | 2017.05.19 |
[파이썬] 행렬(matrix)과 리스트 컴프리헨션(list comprehension) 이해하기 (0) | 2017.05.05 |
[파이썬] 문자열 압축하기 (2) | 2017.02.26 |
집합(set), 시퀀스(sequence), 매핑(mapping) (0) | 2017.02.24 |