본문 바로가기

PYTHON

[Python] 리스트 컴프리헨션 알아보기

컴프리헨션(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]


출처: https://taekho-nology.tistory.com/84