이전 편까지 누적된 반복·조건 지식을 한 단계 정리해봅니다. 컴프리헨션(comprehension)은 "반복 + 조건 + 표현"을 한 줄에 담아 새로운 컬렉션을 만드는 구문입니다. 읽기 쉬운 축약형만 선택적으로 사용하면 데이터 가공 코드가 훨씬 선명해집니다.
이번 글에서 새로 나오는 용어
- 컴프리헨션: 반복문과 조건문을 한 줄 문법으로 압축해 새 리스트·딕셔너리를 만드는 표현
- 집합(set): 중복을 허용하지 않고 순서에 의미가 없는 컬렉션 자료형
- 제너레이터 표현식: 값을 나중에 하나씩 계산하는 둥근 괄호 형태의 축약 문법으로 메모리를 절약
개념 정리
학습 메모
- 소요 시간: 45~55분
- 준비물: 리스트·딕셔너리 감각, 조건·반복 루프
- 학습 목표: 리스트·딕셔너리·집합 컴프리헨션을 작성해 가독성 있게 리팩터링하기
- 컴프리헨션은 반복과 조건을 한 줄 문법으로 축약한 표현입니다.
- 집합(set)은 중복을 허용하지 않는 컬렉션입니다.
- 제너레이터 표현식(generator expression)은 값을 나중에 계산해 메모리를 아낍니다.
코드로 이해하기
리스트 컴프리헨션 기본형
numbers = [1, 2, 3, 4, 5]
squared = [n * n for n in numbers]
even_squared = [n * n for n in numbers if n % 2 == 0]
for n in numbers: 기존 리스트를 순회합니다.n * n: 새 리스트에 담을 표현식입니다.if n % 2 == 0: 필터 역할을 하는 선택적 조건입니다.
조건이 길어질수록 가독성이 떨어지므로, 복잡한 분기라면 for 루프를 유지하거나 함수를 분리합니다.
딕셔너리와 집합 컴프리헨션
people = [
{"name": "민지", "score": 85},
{"name": "준호", "score": 92},
]
score_map = {p["name"]: p["score"] for p in people}
passed = {p["name"] for p in people if p["score"] >= 90}
{키: 값 for ...}형태면 딕셔너리를 반환합니다.{표현식 for ...}형태는 집합(set)이 됩니다. 집합은 중복을 허용하지 않는 자료구조이므로, 필터링 결과를 중복 없이 정리할 때 유용합니다.
중첩 반복 다루기
matrix = [[1, 2], [3, 4], [5, 6]]
flattened = [item for row in matrix for item in row]
왼쪽부터 오른쪽으로 읽으면 for row in matrix → for item in row 순서입니다. 중첩이 깊다면 가독성이 급격히 떨어지므로 2단계 이상은 일반 루프나 itertools를 고려합니다.
조건 표현식과 복합 변환
def normalize(score):
return 0 if score < 0 else min(score, 100)
normalized = [normalize(s) for s in raw_scores]
labels = ["pass" if s >= 60 else "fail" for s in normalized]
조건 표현식(A if 조건 else B)은 짧은 분기를 표현할 때만 사용합니다. 조건이 서로 섞여줄수록 읽기 어렵기 때문에, 중간 계산은 함수로 감싸 명확히 합니다.
성능과 메모리 고려
컴프리헨션은 즉시 새로운 컬렉션을 만들어 메모리에 저장합니다. 데이터가 수십만 건이라면 제너레이터 표현식을 사용하세요.
lazy_numbers = (n * n for n in range(10_000_000))
괄호를 둥근 ( )로 바꾼 형태가 제너레이터 표현식으로, 리스트처럼 결과를 한꺼번에 만드는 대신 실제 값이 필요할 때마다 하나씩 계산합니다. 즉, 컴프리헨션은 즉시 새 컬렉션을 만들고, 제너레이터 표현식은 나중에 하나씩 꺼내 쓰는 지연 평가 방식이라고 이해하면 됩니다. 이 개념은 다음 편의 이터레이터·제너레이터 챕터에서 자세히 다룹니다.
왜 중요할까
- 컴프리헨션은 반복, 조건, 변환을 한 줄로 엮는 축약 구문입니다.
- 리스트·딕셔너리·집합 모두에 적용할 수 있지만 과도한 중첩은 피해야 합니다.
- 대용량 데이터에는 제너레이터 표현식으로 바꿔 메모리를 절약할 수 있습니다.
실습
- 따라 하기: 주어진 리스트·딕셔너리 예제를 그대로 작성하고 루프 버전과 컴프리헨션 버전을 나란히 저장해 차이를 비교합니다.
- 확장하기: CSV 한 줄을 딕셔너리로 바꾸는 로직을 컴프리헨션으로 리팩터링하고 필터 조건을 추가해 집합으로도 만들어 봅니다.
- 디버깅: 중첩 컴프리헨션에 괄호나 순서를 일부러 잘못 넣어
SyntaxError를 만든 뒤 순서를 다시 정리해 고칩니다. - 완료 기준: 리스트·딕셔너리·집합 컴프리헨션 각각 한 개 이상을 실전 코드에 적용해 전후 가독성을 설명할 수 있을 때입니다.
마무리
코드가 컴팩트해질수록 의도도 선명해집니다. 다음 글에서는 함수 자체를 꾸미고 조합하는 데코레이터와 고차 함수를 살펴보겠습니다.
💬 댓글
이 글에 대한 의견을 남겨주세요