파이썬 교재 · 10편 / 27편

리스트 컴프리헨션 — 4줄을 1줄로

for·if·표현을 한 줄에 압축. 파이썬의 시그니처이자 입문자의 첫 큰 도약.

입문읽는 시간 6분2026-05-13
4줄 for 루프를 컴프리헨션 한 줄로 압축한 비교 화면

8편 끝에서 슬쩍 보여드린 한 줄 — [s for s in scores if s >= 80]. 이게 리스트 컴프리헨션(list comprehension) 입니다. 파이썬을 다른 언어와 구분 짓는 가장 눈에 띄는 특징이고, 코드가 갑자기 어른스러워지는 지점이에요. 자바스크립트의 .map()·.filter() 와 비슷한 일을 하지만 문법이 더 짧고 읽힙니다.

10편을 마치면 ① 기본 형태 ② if 필터 ③ if-else 분기 ④ 중첩 ⑤ 딕셔너리·집합 컴프리헨션 ⑥ 언제 쓰지 말지 — 6가지를 손에 익힙니다.

기본 형태 — [표현 for 변수 in 시퀀스]

같은 결과를 4가지 방법으로 비교해봅니다. 모두 0부터 9까지의 제곱 리스트를 만들어요.

# 1) 가장 길게
squares = []
for n in range(10):
    squares.append(n * n)

# 2) for 한 줄
squares = []
for n in range(10): squares.append(n * n)

# 3) 컴프리헨션  ⭐ 권장
squares = [n * n for n in range(10)]

# 4) map (덜 권장)
squares = list(map(lambda n: n*n, range(10)))

3번이 파이썬 표준. 읽는 순서를 "각 n 에 대해, range(10) 안에서, n*n 을 만들어 리스트로" 로 풀면 자연스러워요. 식이 왼쪽, for 가 오른쪽 — 영어 어순이 거꾸로지만 한 번 익으면 쉬워집니다.

if 필터 — 조건에 맞는 것만

오른쪽 끝에 if 조건 을 붙이면 그 조건을 통과한 항목만 포함됩니다.

# 짝수만
evens = [n for n in range(20) if n % 2 == 0]
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

# 합격자 점수만
scores = [82, 91, 75, 88, 60, 95]
passed = [s for s in scores if s >= 80]
# [82, 91, 88, 95]

# 빈 문자열 제거
words = ["hello", "", "world", "  ", "python"]
clean = [w for w in words if w.strip()]
# ['hello', 'world', 'python']  — Truthy 단축

7편의 Truthy/Falsy 가 여기서도 빛납니다. if w.strip() 한 줄로 빈 문자열·공백만 있는 문자열을 같이 거름.

if-else 분기 — 표현 자체에 조건

위의 if 는 "포함할까 말까" 필터. 모든 항목을 두되 "값을 어떻게 만들까" 분기하려면 if-else 가 표현 쪽으로 갑니다.

# 점수 → 합격/불합격 라벨
scores = [82, 75, 60, 95]
labels = ["합격" if s >= 80 else "불합격" for s in scores]
# ['합격', '불합격', '불합격', '합격']

# 절댓값
nums = [-3, 5, -7, 2]
abs_nums = [n if n >= 0 else -n for n in nums]
# [3, 5, 7, 2]

위치가 다른 게 핵심. 필터의 iffor 뒤에, 표현의 if-elsefor 앞에. 둘을 합쳐도 됩니다 — ["A" if s >= 90 else "B" for s in scores if s >= 80] 같이.

⚠️ 가독성의 한계. 컴프리헨션은 한 줄짜리 단순한 변환에 어울립니다. for 안에 if 가 둘 이상이거나, 중첩 컴프리헨션 + 조건이 섞이면 그냥 for 로 풀어 쓰는 게 더 읽혀요. "한 줄로 짤 수 있다" 가 "한 줄로 짜야 한다" 는 아닙니다.

중첩 + 딕셔너리·집합 버전

중첩 for 도 가능합니다. 행렬 평탄화 같은 작업에서.

# 2차원 → 1차원
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [n for row in matrix for n in row]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 읽기: 바깥 for 가 먼저, 안쪽 for 가 다음

딕셔너리 컴프리헨션

# 이름 → 글자 수 매핑
names = ["준성", "수민", "지훈"]
lengths = {n: len(n) for n in names}
# {'준성': 2, '수민': 2, '지훈': 2}

# 점수 → 학점 매핑
scores = {"준성": 88, "수민": 92, "지훈": 65}
grades = {name: ("A" if s >= 90 else "B" if s >= 80 else "C")
          for name, s in scores.items()}
# {'준성': 'B', '수민': 'A', '지훈': 'C'}

집합 컴프리헨션 (중복 제거 + 변환 동시)

words = ["Apple", "apple", "BANANA", "banana"]
unique = {w.lower() for w in words}
# {'apple', 'banana'}  — 자동 중복 제거

중괄호 { } 이지만 키: 값 짝이 없으면 집합. 6편에서 잠깐 언급한 set 의 컴프리헨션 버전입니다.

실무 예시 + 마무리

📌 컴프리헨션이 실무에서 빛나는 5가지

① CSV 읽고 한 컬럼만 추출 ② 파일 목록에서 .py 만 필터 ③ JSON 응답에서 특정 필드만 모으기 ④ 사용자 입력 정제(공백 제거·소문자) ⑤ 통계 계산용 데이터 준비. for 4줄로 매번 짜던 걸 1줄로 압축하니 코드 절대량이 30~50% 줄어듭니다.

# 실무 한 줄 패턴 모음
clean_emails = [e.strip().lower() for e in raw if "@" in e]
py_files     = [f for f in files if f.endswith(".py")]
ages         = [u["age"] for u in users if u.get("active")]
word_counts  = {w: text.count(w) for w in set(text.split())}

이 패턴들이 손에 익으면 짧은 자동화 스크립트는 5-6줄 안에 끝납니다. 컴프리헨션은 입문자가 "파이썬답게" 코드를 짜는 가장 빠른 길.

다음 미션 — REPL 에서: ① 1~30 중 3 또는 5의 배수 합 (FizzBuzz 변형) ② 입력받은 문장에서 단어 길이 리스트 (힌트: split() 과 결합) ③ 학생 dict 리스트에서 80점 이상만 이름 추출.

다음 편 미리보기

11편 — "모듈 import": 표준 라이브러리 활용. random·datetime·os·json·math 같은 단골 모듈로 한 달 만에 자동화 스크립트 짜는 단계.

📚 27편 파이썬 교재 시리즈 — 10/27편
← 9편 "함수 만들기" · 다음: 11편 "모듈 import"

© 2026 주나이테크(주) @JUNAITECH