본문 바로가기
C.W.K.
Stream
Lesson 06 of 07 · published

컴프리헨션 — 결과의 모양을 한 문장으로 쓰기

~25 min · comprehension, list-comp, dict-comp, generator-expression

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

반복해서 결과를 모으는 기본 문법

[표현식 for 값 in 반복값]은 “각 값으로 무엇을 만들 것인가”를 바로 보여줘. 같은 구조로 딕셔너리와 집합도 만들 수 있어. 단순 변환을 위해 빈 리스트와 append를 준비하는 코드보다 결과가 먼저 보여서 읽기 쉬워.

필터와 조건부 표현식은 자리가 다르다

맨 뒤의 if 조건은 원소를 포함할지 결정하고, 앞쪽의 A if 조건 else B는 포함할 값을 골라. 둘을 헷갈리면 결과의 개수부터 달라져.

대괄호를 괄호로 바꾸면 지연 계산이 돼

제너레이터 표현식은 값을 한꺼번에 저장하지 않고 소비자가 요구할 때 하나씩 만들어. sum, any, all처럼 한 번만 읽는 소비자나 큰 입력에 잘 맞아.

한 줄이 복잡해지면 멈춰

중첩 컴프리헨션은 두 겹 정도까지도 읽기 어려울 수 있어. 여러 분기나 부수 효과가 들어가면 평범한 반복문이나 이름 붙인 함수가 더 Python다워.

Code

반복과 append를 리스트 컴프리헨션으로 바꾸기·python
nums = [1, 2, 3, 4, 5]

# 장황한 방법
doubled = []
for n in nums:
    doubled.append(n * 2)
print(doubled)            # [2, 4, 6, 8, 10]

# 컴프리헨션
doubled = [n * 2 for n in nums]
print(doubled)            # [2, 4, 6, 8, 10]

# 필터 추가
evens_doubled = [n * 2 for n in nums if n % 2 == 0]
print(evens_doubled)      # [4, 8]
딕셔너리와 집합 컴프리헨션·python
words = ["alpha", "beta", "gamma"]

# dict — 콜론 = dict
lengths = {w: len(w) for w in words}
print(lengths)            # {'alpha': 5, 'beta': 4, 'gamma': 5}

# set — 콜론이 없으면 set
length_set = {len(w) for w in words}
print(length_set)         # {4, 5}

# dict 뒤집기 (값이 hashable 일 때)
original = {"a": 1, "b": 2, "c": 3}
flipped = {v: k for k, v in original.items()}
print(flipped)            # {1: 'a', 2: 'b', 3: 'c'}
값을 저장하지 않는 제너레이터 표현식·python
nums = range(1_000_000)

# list 컴프리헨션 — 백만 개 list 만들고 합산. ~30MB 사용.
total_list = sum([x * x for x in nums])

# generator expression — 한 번에 한 제곱만, 메모리 거의 안 씀
total_gen = sum(x * x for x in nums)

print(total_list == total_gen)              # True — 같은 답

# 괄호가 이미 있으면 안쪽 괄호 생략 가능
any(x > 100 for x in nums)
max(x * 2 for x in nums)
필터와 조건부 표현식 구분하기·python
nums = [-2, -1, 0, 1, 2]

# 필터 — 원소 떨어뜨림
filtered = [x for x in nums if x > 0]
print(filtered)           # [1, 2]

# 조건부 — 모든 원소 살리고 변형
transformed = [x if x > 0 else 0 for x in nums]
print(transformed)        # [0, 0, 0, 1, 2]

# 둘 다 — 필터 + 변형
result = [x * 10 for x in nums if x > 0]
print(result)             # [10, 20]
중첩이 읽기 어려워지는 지점·python
# 3x3 그리드
grid = [[i*3 + j for j in range(3)] for i in range(3)]
print(grid)               # [[0, 1, 2], [3, 4, 5], [6, 7, 8]]

# 평탄화 — 순서 주의 — 바깥 for 가 먼저, 안쪽 for 가 두 번째
flat = [n for row in grid for n in row]
print(flat)               # [0, 1, 2, 3, 4, 5, 6, 7, 8]

# for 절 두 개 넘으면 그냥 loop 써. 가독성이 이김.

External links

Exercise

prices = [("AAPL", 180), ("MSFT", 420), ("GOOG", 145), ("NVDA", 950), ("TSLA", 215)]에서 티커 리스트, {ticker: price} 딕셔너리, 가격이 200보다 큰 티커 리스트, 평균 가격을 각각 컴프리헨션과 sum 안의 제너레이터 표현식으로 만들어. 반복문·append·map·filter는 쓰지 마.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.