리스트 컴프리헨션은 조건문과 반복문 성질을 이용해서 리스트를 만드는 것이다. 형태는 아래와 같다.
[ 표현식 for 원소 in 반복 가능한 객체 ]
[ 표현식 for 원소 in 반복 가능한 객체 if문 ]
리스트 컴프리헨션을 사용하지 않고 리스트를 생성한다면 아래와 같을 것이다.
odd_numbers = [ ]
for element in range(1,11):
if (element % 2) == 1:
odd_numbers.append(element)
하지만 리스트 컴프리헨션을 사용한다면 이를 단 한줄로 바꿀 수 있다.
list_comprehension = [ element for element in range(1,11) if (element % 2) == 1 ]
이처럼 리스트 컴프리헨션은 자칫 길게 작성해야 하는 리스트 생성문을 짧게 줄여주는 장점이 있다. 따라서 당연한 말이지만 반복문과 조건문으로 생성 가능한 리스트는 컴프리헨션으로 작성이 가능하고 그 반대도 가능하다.
또한 리스트 컴프리헨션은 성능면에서도 기존 반복문과 조건문을 사용하는 것보다 탁월하다. 아래 코드는 timeit
모듈을 이용해 성능을 비교한 코드다.
import timeit
def for_loop():
num_list = []
for i in range(1000):
num_list.append(i)
def list_comprehension():
num_list = [ i for i in range(1000) ]
if __name__ == "__main__":
time1 = timeit.Timer("for_loop()", "from __main__ import for_loop")
print("for loop time = ", time1.timeit(number=1000), "milliseconds")
time2 = timeit.Timer("list_comprehension()", "from __main__ import list_comprehension")
print("list_comprehension time = ", time2.timeit(number=1000), "milliseconds")
아래는 상단의 코드의 실행 결과다.
for loop time = 0.062743696 milliseconds
list_comprehension time = 0.024242144999 milliseconds
리스트 컴프리헨션이 for문보다 2배 이상 성능이 좋은 것을 확인할 수 있다.
리스트 컴프리헨션은 백엔드에서 데이터베이스를 조회해서 리스트로 만들 때 많이 사용된다. 또한 성능 개선을 위해서도 사용이 되기도 한다.
하지만 리스트 컴프리헨션이 만능은 아니다. 단점도 존재하는데 구글 파이썬 스타일 가이드에 따르면 간단한 리스트 컴프리헨션은 직관적이고 보기 좋을 수 있으나 반복문과 조건문이 여러 개가 붙는다면 기존의 반복문과 조건문을 보는 것보다 이해하기 어려울 수 있다고 조언한다.
때문에 상황이 간단할 때 리스트 컴프리헨션을 사용하는 것을 권장한다. 상황이 복잡하다면 기존의 반복문과 조건문을 사용하는 것이 오히려 좋을 수 있다. 복잡한 리스트 컴프리헨션은 개발자가 이해하기 힘들기 때문이다.
1. 구글 파이썬 스타일 가이드
https://google.github.io/styleguide/pyguide#273-cons
2. 윤성우 열혈 파이썬 중급편