한양과학기술고등학교

에듀테크 프로젝트 대시보드

컴프리헨션

list comp dict comp set comp generator expr

반복문 + 조건을 한 줄로. [식 for 변수 in 반복 if 조건]

1. 리스트 컴프리헨션

squares = [n * n for n in range(5)]        # => [0, 1, 4, 9, 16]
evens = [n for n in range(10) if n % 2 == 0]

# 삼항식으로 값 변형 (if 위치가 앞!)
labels = ["짝" if n % 2 == 0 else "홀" for n in range(4)]

# 동등한 for 문
result = []
for n in range(5):
    result.append(n * n)

2. 중첩

# 이중 루프 — for 를 왼쪽부터 바깥→안 순서로
pairs = [(i, j) for i in range(3) for j in range(2)]
# => [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]

# 행렬 평탄화
matrix = [[1, 2], [3, 4]]
flat = [x for row in matrix for x in row]   # => [1, 2, 3, 4]

# 중첩 리스트 생성 (컴프리헨션 안에 컴프리헨션)
grid = [[0 for _ in range(3)] for _ in range(2)]

3. dict·set 컴프리헨션

{n: n * n for n in range(4)}          # => {0:0, 1:1, 2:4, 3:9}
{v: k for k, v in d.items()}          # 키-값 뒤집기

{c for c in "banana"}                 # => {'b', 'a', 'n'}

# 두 리스트로 dict
dict(zip(["a", "b"], [1, 2]))         # => {'a': 1, 'b': 2}

4. 제너레이터 표현식

# 대괄호 대신 소괄호 — 값을 미리 다 만들지 않고 필요할 때 하나씩
gen = (n * n for n in range(1_000_000))
total = sum(n * n for n in range(1_000_000))   # 함수 인자면 괄호 생략 가능

# 메모리: 리스트 컴프리헨션은 전부, 제너레이터는 한 개씩
any(x > 100 for x in data)   # 조건 만족 즉시 멈춤

5. 조건 위치 정리

if 가 두 군데
  • 필터(뒤): [x for x in xs if x > 0] — 조건 안 맞으면 건너뜀
  • 표현식(앞): [x if x > 0 else 0 for x in xs] — 항상 원소 생성, 값만 선택
  • 둘 다: [x if x else -1 for x in xs if x is not None]

6. 과유불급

컴프리헨션을 쓰지 말아야 할 때
  • 부수효과만 필요할 때(print 등) → 그냥 for 문
  • 3중 이상 중첩이나 복잡한 로직 → 가독성 위해 일반 루프
  • 중간 결과가 필요하거나 break 가 필요할 때
"명시적인 것이 암시적인 것보다 낫다 (Explicit is better than implicit)"