Python 컴프리헨션 통합 정리
선수학습(2개)
요약
리스트·딕셔너리·집합·제너레이터 4종 컴프리헨션의 형식, 반환 타입, 메모리·평가 시점 차이를 한 자리에서 비교합니다. 같은 중괄호도 콜론 유무로 딕셔너리·집합이 갈리고, 같은 모양의 코드가 어떤 자료형을 만드는지 빠르게 구분할 수 있도록 정리했습니다.
컴프리헨션 핵심 정리
컴프리헨션(comprehension)은 반복문과 조건식을 한 줄로 압축해 새 자료구조를 만드는 문법입니다. Python에는 자료구조마다 다른 컴프리헨션 4종이 있고, 같은 공식을 괄호 모양만 바꿔서 사용합니다. 모든 컴프리헨션은 반복가능객체1에서 값을 하나씩 꺼내 표현식2을 계산하고, 그 결과를 새 자료구조에 담는 형태입니다.
| 종류 | 형식 | 반환 타입 | 평가 시점 | 메모리 |
|---|---|---|---|---|
| 리스트 컴프리헨션 | [표현식 for 변수 in 반복가능객체] | list | 즉시 | 전체 결과 보관 |
| 딕셔너리 컴프리헨션 | {키표현식: 값표현식 for ...} | dict | 즉시 | 전체 결과 보관 |
| 집합 컴프리헨션 | {표현식 for ...} | set | 즉시 | 전체 결과 보관 (중복 제거) |
| 제너레이터 표현식 | (표현식 for ...) | generator | 게으름 (꺼낼 때마다) | 한 번에 1개 |
학습 포인트는 두 가지입니다.
- 괄호 모양으로 결과 자료형이 갈립니다. 대괄호는 리스트, 소괄호는 제너레이터, 중괄호는 딕셔너리 또는 집합입니다.
- 중괄호 안에 콜론(
:)이 있는지 여부가 딕셔너리와 집합을 가르는 결정적 차이입니다.
리스트 컴프리헨션 기초
대괄호 [] 를 쓰면 결과가 리스트가 됩니다. 반복문과 조건식을 한 줄로 압축해 새 리스트를 만드는 문법입니다.
리스트 컴프리헨션 기본 형식
for문이 한 번 돌 때마다 표현식의 결과가 새 리스트의 요소로 들어갑니다.
모든 요소를 2배로
![리스트 [1, 2, 3, 4, 5]의 각 요소에 *2 변환이 적용되어 새 리스트 [2, 4, 6, 8, 10]이 만들어지는 변환 흐름도](/_next/image?url=%2Fcoding%2Fpython%2Fcomprehension%2Flist-comp.webp&w=3840&q=75)
이는 다음 for문과 동일합니다.
리스트에서 조건 필터링
if 절을 붙이면 조건을 만족하는 요소만 포함합니다.
표현식에 연산 적용
딕셔너리 컴프리헨션 기초
중괄호 {} + 콜론 : 을 쓰면 결과가 딕셔너리가 됩니다. 반복문과 조건식을 한 줄로 압축해 새 딕셔너리를 만드는 문법입니다.
딕셔너리 컴프리헨션 기본 형식
키표현식: 값표현식 형태로 매 회차마다 한 쌍의 키·값을 만들어 새 딕셔너리에 담습니다.
요소를 키, 변환값을 값으로

딕셔너리에서 조건 필터링
집합 컴프리헨션
중괄호 {} 를 쓰되 콜론 :이 없으면 결과가 집합이 됩니다. 딕셔너리와 같은 괄호를 쓰지만, 키·값 한 쌍이 아니라 단일 표현식이 들어갑니다.
집합 컴프리헨션 기본 형식
![리스트 [1, 2, 2, 3, 3, 3, 4]에서 처음 등장한 값만 통과하고 중복은 흡수되어 집합 {1, 2, 3, 4}가 만들어지는 흐름도](/_next/image?url=%2Fcoding%2Fpython%2Fcomprehension%2Fset-comp.webp&w=3840&q=75)
nums에는 2와 3이 여러 번 등장하지만, 집합은 중복을 자동으로 제거합니다. 그래서 결과에는 각 값이 한 번씩만 남습니다.
집합에서 조건 필터링
if 절을 붙이면 조건을 만족하는 값만 모을 수 있습니다.
변환과 중복 제거를 한 번에
문자열에서 모음만 골라내거나 단어 길이의 종류를 세는 것처럼, 어떤 변환을 거치면서 동시에 중복까지 없애고 싶을 때 집합 컴프리헨션이 유용합니다.
리스트로 만들면 [5, 6, 6, 4]처럼 같은 길이(banana=6, cherry=6이라 6이 중복)가 두 번 들어가지만, 집합으로 만들면 자동으로 중복 제거됩니다.
제너레이터 표현식 기초
소괄호 () 를 쓰면 결과가 제너레이터 객체가 됩니다. 제너레이터 객체는 값을 미리 다 만들지 않고, for문이나 next()로 요청할 때마다 하나씩 만들어주는 도우미입니다.

리스트 컴프리헨션과 모양이 거의 같지만, 결과를 한꺼번에 만들지 않고 for문이나 next()로 값을 요청할 때마다 하나씩 계산해서 내어줍니다.
next()는 제너레이터에서 다음 값을 하나 꺼내는 내장 함수입니다. 호출할 때마다 표현식을 한 번 평가해서 결과를 돌려줍니다.
값이 모두 소진된 뒤에 next()를 한 번 더 호출하면 StopIteration 예외가 발생합니다. for문은 내부에서 자동으로 next()를 반복 호출하다가 StopIteration이 나오면 멈추는 구조입니다.
next() 함수의 자세한 동작, 게으른 평가3, sum()·any()·all() 같은 집계 함수와의 결합, 시험에 나오는 패턴 등 자세한 설명은 제너레이터 표현식에서 다룹니다.
4종 비교 정리 심화
괄호 모양으로 결과 자료형 구분하기

같은 x * 2 for x in nums 표현이라도 어떤 괄호로 감쌌는지에 따라 결과 자료형이 완전히 달라집니다.
중괄호 안의 콜론 유무
가장 헷갈리는 부분은 딕셔너리와 집합이 같은 중괄호를 쓴다는 점입니다. 구분하는 단서는 단 하나, 콜론 :입니다.
| 코드 | 결과 자료형 | 이유 |
|---|---|---|
{x for x in nums} | set | 콜론 없음, 단일 표현식 |
{x: x * 2 for x in nums} | dict | 콜론으로 키와 값을 구분 |
{x * 2 for x in nums} | set | 콜론 없음, 단일 표현식 |
빈 중괄호 {}는 집합이 아니라 빈 딕셔너리라는 점도 함께 기억하면 좋습니다. 빈 집합은 set()으로 따로 만들어야 합니다.
언제 어느 걸 쓰는가
| 상황 | 선택 | 이유 |
|---|---|---|
| 결과 전체를 한꺼번에 다루고 싶다 | 리스트 컴프리헨션 | 인덱스 접근·재사용 자유로움 |
| 키로 값을 빠르게 찾고 싶다 | 딕셔너리 컴프리헨션 | 매핑 자료구조가 필요할 때 |
| 중복을 자동으로 제거하고 싶다 | 집합 컴프리헨션 | 집합의 고유성 활용 |
| 결과가 매우 크거나 앞 일부만 쓰는 경우 (예: 1억 개 중 앞 10개만) | 제너레이터 표현식 | 메모리 절약, 게으른 평가 |