리스트 컴프리헨션(List Comprehension)이란?
리스트를 더 직관적이고, 간결하게 표현할 수 있는 방법이다.
리스트 뿐만 아니라 튜플, 사전, 집합에도 컴프리헨션이 있으나, 그중 가장 기본이면서도 많이 사용하는 것이 리스트 컴프리헨션이라할 수 있다.
리스트 컴프리헨션이 쓰인 코드를 직관적으로 이해하는 것은 크게 어렵지 않으나, 그것을 자유자재로 활용할 수 있는 것은 다른 영역이다. 혹자는 이것으로 파이썬의 뉴비와 주니어, 시니어를 구분하기도 한다. 파이썬 코딩의 척도로도 쓰일만큼 중요한 List Comprehension에 대해 알아보자.
기존에 배운 문법으로 0부터 9까지의 정수를 리스트로 생성하는 코드는 다음과 같다.
number=[]
for n in range(0,10,1):
number.append(n)
이러한 코드를 컴프리헨션으로 표기하면 아래와 같이 나타낼 수 있다.
[x for x in range(10)]
리스트를 생성하는 방식은 대괄호로 생성한다는 점에서 동일하다. 하지만, 컴프리헨션은 리스트 내부에 코드를 작성한다.
컴프리헨션에서 사용한 변수 x는 for 문 내부에서 append 메서드에 인자로 넣은 변수 n과 같다. n과 마찬가지로 x는 리스트에 append될 수의 형식을 지정해준다고 보면 된다.
고로, 다음 코드의 출력값이 2의 구구단(1~10)이 나오게 되는 것이다.
[2*x for x in range(1,11,1)]
result : [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
기존의 문법으로 1부터 10까지 숫자중 짝수만 순차적으로 들어있는 리스트를 생성하는 코드는 다음과 같다.
even_num = []
for n in range(1,11):
if n%2 ==0:
even_num.append(n)
컴프리헨션에서는 if 예약어 또한 지원한다. 이때 if 키워드는 for문 다음에 위치해야 한다. 이를 바탕으로 위와 같은 출력값을 가지는 리스트 컴프리헨션을 작성해보자.
[x for x in range(1,11) if x%2 ==0]
result: [2,4,6,8,10]
컴프리헨션은 내부에서 for 키워드와 if 키워드를 반복해서 사용할 수 있다.
예를들어, 저녁으로 먹을 메뉴 (쌈밥, 치킨, 피자) 중 하나와 후식으로 먹을 메뉴 (사과, 아이스크림, 커피) 중 하나를 정할 때 경우의 수를 뽑는 코드를 컴프리헨션으로 작성해보자.
[(x,y) for x in ["쌈밥", "치킨", "피자"] for y in ["사과", "아이스크림", "커피"]]
기존의 문법으로는 이중 for문을 사용해서 작성해야하는 코드를 한 줄로 명료하게 표현할 수 있다.
if문 또한 중복하여 작성해서 여러 조건을 걸 수 있습니다.
[x for x in range(1,10,1) if x < 5 if x%2 == 0]
'if-else' 조건은 리스트 컴프리헨션 내에서 각 element에 대해 두 가지 다른 표현식 중 하나를 적용하고자 할 때 사용한다.
# 예: 10 이하의 수에서 짝수는 그대로, 홀수는 음수로 변환
result = [x if x % 2 == 0 else -x for x in range(1,11)]
이 예에서 x if x % 2 == 0 else -x는 각 x에 대해 x가 짝수이면 x를 그대로 반환하고, 홀수이면 -x를 반환하게 된다.
리스트 컴프리헨션에 반복문과 조건문만이 쓰인다고 착각해서는 안된다. 리스트의 표현식(위에서는 x)에 다양한 함수를 적용시킴으로써 리스트 컴프리헨션 내부에 다양한 함수가 쓰일 수도 있다.
def some_func(x):
x= int(x)+10
return x
list = [func(i) for i in range(5)]
List comprehension을 처음 접하고, 사용할 때는 적응하기 어렵울 지도 모른다. 하지만, 파이썬의 꽃이라 불리는 리스트 컴프리헨션에 익숙해질수록 더 직관적인 코드를 작성해 나갈 수 있을 것이라 의심치 않는다.