컴프리헨션(Comprehension)
- 컴프리헨션은 함축을 의미한다. 하나 이상의 Iterator로부터 파이썬 자료구조를 만드는 방법이다. 간편한 구문으로 반복문과 조건 테스트를 결합할 수 있게 해준다.
- 컴프리헨션을 사용하는 것은 초급 이상의 단계에서 파이썬을 어느 정도 알고 있다는 것을 의미한다. 즉, 더 파이써닉하게 사용한다는 것을 의미한다.
대표적인 컴프리헨션 방법에는 리스트 컴프리헨션이 있다. 대괄호 안에 for 구문을 사용하여 리스트를 초기화 함으로써 컴프리헨션 기능을 수행할 수 있다. 리스트의 요소로 리스트가 포함될 수 있는 만큼, 컴프리헨션 역시 중첩되서 사용이 가능하다. 그러나 파이써닉하게 코딩하면서도, 가독성을 해치지 않는 범위까지만 컴프리헨션 중첩을 사용하자.
컴프리헨션은 리스트를 생성하는 손쉬운 단축코드라고 볼 수 있다. 많은 경우 우리는 리스트를 만들기 위해 다음과 같은 코드를 많이 만들게 된다.
mylist = []
for x in range(1, 10):
mylist.append(x*x)
이 코드는 1~9까지 수의 제곱을 가지는 리스트를 만든다. 비슷하게 랜덤 수 n개를 만드는 리스트는 다음과 같다.
randlist = []
for x in range(n):
randlist.append(rand.randrange(100))
여기서 rand.randrange(100)은 0~99 사이의 랜덤값을 생성하여 돌려주는 rand 모듈의 함수다. 어쨌거나 이 코드는 n개의 랜덤수를 randlist에 넣어준다. 문제는 이런 식으로 리스트를 만들어야 하는 일이 너무 많다는 것이다. 파이썬에서는 많은 것을 리스트로 다루고 리스트에서 다른 리스트를 계산해내는 일이 매우 많다. 이런 코드를 다 일일이 새로 빈 리스트 정의하고 for 루프 돌려서 일일이 append한다면 파이썬 언어의 오늘날의 명성은 없었을 것이다.
컴프리헨션은 이런 코드를 다음과 같이 간략하게 작성하게 해 준다.
mylist = [x*x for x in range(1, 10)]
randlist = [rand.randint(100) for _ in range(n)]2
이렇게 한 줄로 새로운 리스트를 만드는 것이 가능하다. 이것이 파이썬의 강력함의 시작이다.
몇 가지 인상적인 예제를 좀더 살펴보자. 우리는 randlist로부터 다음과 같은 새로운 리스트를 간단히 만들 수 있다.
# randlist에서 3의 배수만 가지는 리스트
multiple3 = [i for i in randlst if i % 3 == 0]
# 3이나 5로 나누어지지 않는 숫자의 리스트
not_divide_3or5 = [i for i in randlst if i % 3 != 0 and i % 5 != 0]
출처: https://plas.tistory.com/38
[표현식 for 변수 in 리스트(순회 가능한 객체)]
list(식 for 변수 in 리스트(순회 가능한 객체))
number_list = [number for number in range(1, 6)] # [1, 2, 3, 4, 5]
number_list = [number-1 for number in range(1, 6)] # [0, 1, 2, 3, 4]
[식 for 변수 in 리스트(순회 가능한 객체) if 조건식]
list(식 for 변수 in 리스트(순회 가능한 객체) if 조건식)
a_list = [number for number in range(1, 6) if number % 2 == 1] # [1, 3, 5]
'PYTHON' 카테고리의 다른 글
[Python / 파이썬] 파이썬에서 정규표현식 사용하기 (0) | 2019.07.18 |
---|---|
[Python 파이썬] __getitem__() 를 이용한 튜플의 리스트, 리스트의 리스트 다루기 (Handling List of Tuples, List of Lists) // 리스트 안에 튜플 (0) | 2019.07.17 |
[Python] 문자열에 문자열 리스트의 요소가 포함되어 있는지 찾기 (0) | 2019.07.16 |
[Python] 파이썬 형변환 하기 (0) | 2019.07.12 |
[Python] list, tuple, dictionary (0) | 2019.07.12 |