Python

Python 리스트 컴프리헨션 완전 정복 — for문 5줄을 1줄로 줄이는 마법

2026-03-02
8분

리스트 컴프리헨션이 왜 Python의 꽃인가?

리스트 컴프리헨션(List Comprehension)은 리스트를 한 줄로 생성하는 Python 고유의 문법입니다. 다른 언어에는 없거나 제한적인 기능이라, Python을 Python답게 쓰는 첫 번째 관문이기도 합니다.

실제로 Python 코드 리뷰에서 '이건 컴프리헨션으로 바꾸세요'라는 피드백은 가장 흔한 것 중 하나입니다. 읽기 쉽고, 빠르고, Pythonic한 코드의 핵심이니까요.

기본 문법 — for문과 비교하기

일반 for문으로 제곱수 리스트를 만들면 4줄이 필요합니다: 빈 리스트 생성, for문, append, 결과 확인. 리스트 컴프리헨션으로는 단 1줄: [x ** 2 for x in range(10)].

가독성도 좋고, 실행 속도도 약 20~30% 더 빠릅니다. 내부적으로 C 레벨 최적화가 적용되기 때문입니다.

조건 필터링 — if와 함께 쓰기

[x for x in range(20) if x % 2 == 0] — 조건을 뒤에 붙이면 필터링할 수 있습니다. for문 + if문 + append 3줄을 1줄로 압축하는 것이죠.

더 복잡한 조건도 가능합니다: [x for x in data if x > 0 and x < 100]처럼 and, or를 조합할 수 있습니다.

if-else 표현식 — 값을 변환할 때

필터링이 아니라 값을 변환할 때는 if-else를 앞에 씁니다: [x if x > 0 else 0 for x in data]. 음수를 0으로 바꾸는 예제인데, 데이터 전처리에서 자주 사용됩니다.

주의: if만 쓸 때(필터링)는 뒤에, if-else(변환)는 앞에 위치합니다. 이 차이를 기억하세요!

중첩 컴프리헨션 — 2차원 데이터 처리

2차원 리스트를 평탄화(flatten)할 때 유용합니다: [x for row in matrix for x in row]. 이중 for문을 왼쪽에서 오른쪽으로 읽으면 됩니다.

하지만 3중 이상의 중첩은 오히려 가독성을 해칩니다. 2중까지만 컴프리헨션으로, 그 이상은 일반 for문으로 작성하세요.

딕셔너리와 집합 컴프리헨션

리스트뿐만 아니라 딕셔너리와 집합도 컴프리헨션으로 생성할 수 있습니다.

딕셔너리: {word: len(word) for word in words} — 단어별 길이를 매핑하는 딕셔너리를 한 줄로!

집합: {len(word) for word in words} — 중복 없는 길이 목록을 한 줄로!

실전 활용 패턴과 주의사항

쓸 때

단순한 변환이나 필터링, 한 줄로 의미가 명확할 때 사용하세요. 코드를 읽는 사람이 3초 안에 이해할 수 있어야 합니다.

쓰지 말 때

복잡한 로직이 들어가거나, 부수효과(파일 쓰기, API 호출 등)가 있을 때, 3중 이상 중첩될 때는 일반 for문이 더 좋습니다. 컴프리헨션은 '간결함'이 목적이지, '짧은 코드'가 목적이 아닙니다.