-
[Python] 리스트 컴프리헨션(List Comprehension)을 이해한다는 것IT 2026. 1. 21. 15:49

파이썬을 배우다 보면 어느 순간 이런 코드를 마주하게 됩니다.
squares = [x * x for x in range(10)]처음에는 신기하고, 익숙해지면 편리하지만, 막상 누군가가 "리스트 컴프리헨션이 뭐야?"라고 물으면 명확하게 설명하기가 쉽지 않습니다.
어떤 사람에게는 단순한 축약 문법처럼 느껴지고, 또 어떤 사람에게는 읽기 어려운 코드처럼 보이기도 합니다.
이 글에서는 리스트 컴프리헨션을 설명합니다.
우리는 왜 for 문으로 리스트를 만들까?
리스트 컴프리헨션을 이해하려면, 먼저 우리가 평소에 리스트를 어떻게 만드는지부터 떠올려보는 것이 좋습니다.
result = [] for x in range(10): result.append(x * x)이 코드는 너무나 익숙하고, 전혀 문제가 없어 보입니다. 하지만 이 코드에는 사실 두 가지 일이 동시에 섞여 있습니다.
첫째는 "10까지 반복한다"는 반복의 흐름이고, 둘째는 "값을 가공해서 리스트에 담는다"는 의도 입니다. 이 두 가지가 한 덩어리로 엮어 있기 때문에, 코드가 길어지고 핵심이 흐려지고도 합니다.
리스트 컴프리헨션은 바로 이 지점에서 출발합니다.
"반복 구조는 숨기고, 무엇을 만드록 싶은지만 드러낼 수 없을까?"
리스트 컴프리헨션은 의도를 드러내는 문법이다
위의 for 문 코드를 리스트 컴프리헨션으로 바꾸면 이렇게 됩니다.
result = [x * x for x in range(10)]이 코드를 말로 읽어보면 "0부터 9까지의 x에 대해 x의 제곱으로 이루어진 리스트"라고 자연스럽게 해석할 수 있습니다. 즉, 어떻게 반복하는지보다 무엇으로 이루어진 리스트인지가 더 먼저 눈에 들어옵니다.
이 점에서 리스트 컴프리헨션은 단순히 축약이 아니라, 선언형 표현에 가까운 문법이라고 볼 수 있습니다.
조건이 들어가면 더 분명해진다
리스트 만들 때는, 모든 값을 다 담고 싶지 않은 경우도 많습니다. 예를 들어 짝수만 골라서 제곱하고 싶다면, 기존 방식은 이렇게 작성했을 것 입니다.
result = [] for x in range(10): if x % 2 == 0: result.append(x * x)리스트 컴프리헨션으로 바꾸면 다음과 같습니다.
result = [x * x for x in range(10) if x % 2 == 0]여기서 중요한 점은, 조건문이 뒤로 밀려나 있다는 것입니다. 이는 "무엇을 만들 것인가"가 여전히 앞에 있고, 조건은 그 대상을 제한하는 역할만 한다는 인상을 줍니다.
읽기 쉬운가, 어려운가?
리스트 컴프리헨션에 대해 자주 나오는 논쟁 중 하나는 가독성입니다. 어떤 사람은 한 줄로 끝나는 코드가 깔끔하다고 느끼고, 어떤 사람은 for 문이 더 명확하다고 느낍니다.
여기서 중요한 기준은 줄 수 가 아니라 한 눈에 이해할 수 있는가입니다.
result = [process(x) for x in data if is_valid(x) and x > 0]이 정도까지는 대부분의 사람이 무리 없이 읽을 수 있습니다. 하지만 조건이 여러 개 겹치거나, 표현식이 지나치게 길어지면 오히려 이해하기 어려워질 수 있습니다.
리스트 컴프리헨션은 “짧을 때 가장 아름답다”는 점을 기억하는 것이 중요합니다.
중첩된 리스트 컴프리헨션은 신중하게
리스트 컴프리헨션은 중첩해서 사용할 수도 있습니다.
pairs = [(x, y) for x in range(3) for y in range(3)]이 코드는 문법적으로는 문제가 없지만, 익숙하지 않은 사람에게는 한 번에 이해되기 어렵습니다. 이런 경우에는 차라리 for 문을 사용하는 것이 더 친절할 수 있습니다.
리스트 컴프리헨션은 코드를 똑똑하게 보이게 만드는 도구가 아니라, 의도를 명확하게 만드는 도구라는 점을 잊지 않는 것이 좋습니다.
제너레이터와의 연결점
앞에서 제너레이터를 다뤘다면, 리스트 컴프리헨션과의 관계도 자연스럽게 떠올릴 수 있습니다.
squares = (x * x for x in range(10))대괄호 대신 소괄호를 사용하면, 리스트가 아니라 제너레이터가 만들어집니다. 이 차이는 “모든 값을 지금 당장 저장할 것인가, 필요할 때 하나씩 만들 것인가”라는 선택의 차이입니다.
즉, 리스트 컴프리헨션과 제너레이터 표현식은 같은 문법적 사고에서 출발했지만, 서로 다른 사용 목적을 가지고 있습니다.
리스트 컴프리헨션을 이해하는 핵심 질문
리스트 컴프리헨션을 잘 쓰고 있는지를 판단하는 가장 좋은 질문은 이것입니다.
"이 한 줄의 코드를 말로 설명할 수 있는가?"
자연스럽게 문장으로 설명할 수 있다면, 그 리스트 컴프리헨션은 대부분 좋은 코드입니다. 반대로 설명하기 어렵다면, 그 코드는 이미 너무 많은 일을 하고 있을 가능성이 큽니다.
마무리하며
리스트 컴프리헨션은 파이썬을 파이썬답게 만들어주는 문법 중 하나입니다. 하지만 모든 상황에서 사용해야 하는 만능 도구는 아닙니다.
중요한 것은 짧은 코드가 아니라, 의도가 잘 드러나는 코드입니다. 리스트 컴프리헨션은 그 의도를 가장 잘 드러낼 수 있을 때 사용하면 됩니다.
결국 이 문법을 이해한다는 것은, 이런 질문에 답할 수 있다는 뜻입니다.
"나는 지금 어떤 리스트를 만들고 싶은가?"
그 질문이 명확하다면, 리스트 컴프리헨션은 아주 자연스럽게 따라올 것입니다.
여기까지 입니다.
감사합니다.
'IT' 카테고리의 다른 글
[Python] 디스크립터(descriptor)를 이해한다는 것 (0) 2026.01.22 [Python] 시퀀스 프로토콜(Sequence Protocol)을 이해한다는 것 (1) 2026.01.21 [Python] 이터레이터와 제너레이터, 그리고 파이썬의 지연 평가 (0) 2026.01.21 [Python] 파이썬 제너레이터(Generator)를 이해한다는 것 (0) 2026.01.21 [Python] 파이썬 클로저(Closure)를 이해한다는 것 (0) 2026.01.21