list comprehension은 하나의 표현식으로 iterable을 변환하거나 필터링하여 리스트를 만드는 간결하고 읽기 쉬운 방법입니다 — 리스트에 append하는 for 루프에 대한 Python의 관용적 대안입니다.
기본 문법
python
squares = []
n ():
squares.append(n ** )
squares = [n ** n ()]
"range(5)의 각 n에 대해 n의 제곱"으로 읽습니다. 수동 루프보다 더 간결하고 종종 더 빠릅니다.
# 짝수만 유지
evens = [n for n in range(10) if n % 2 == 0] # [0, 2, 4, 6, 8]
# 변환과 필터링을 함께
result = [n * 2 for n in range(10) if n % 2 == 0] # [0, 4, 8, 12, 16]
# if/else는 for 앞에 옵니다 (필터가 아니라 표현식의 일부)
labels = ["even" if n % 2 == 0 else "odd" for n in range(4)]
# ["even", "odd", "even", "odd"]
{x ** 2 for x in range(5)} # set comprehension → {0, 1, 4, 9, 16}
{k: v for k, v in pairs} # dict comprehension
(x ** 2 for x in range(5)) # generator expression — 지연 평가, 메모리 효율적
동일한 문법으로 set과 dict도 만들 수 있으며, 괄호를 사용하면 값을 지연 생성하는 generator expression이 됩니다(전체 리스트가 메모리에 없음 — 대용량 데이터에 적합).
# ❌ 깊이 중첩되거나 복잡한 로직 → 일반 루프가 더 읽기 쉬움
matrix = [[row[i] for row in data] for i in range(cols)] # 괜찮지만, 과도하게 중첩하지 말 것
comprehension은 단순하게 유지하세요. 여러 중첩 루프나 복잡한 조건이 필요하다면 일반 루프가 더 명확합니다.
list comprehension은 전형적인 "Pythonic" 기능으로 — 간결하고 읽기 쉬우며 동등한 루프보다 종종 더 빠르고, 데이터를 변환하고 필터링하는 데 끊임없이 사용됩니다.
이를 숙달하는 것(set/dict/generator 변형, 그리고 대용량 데이터를 위한 지연 generator expression 포함)은 관용적인 Python을 작성하는 데 필수적입니다.
언제 사용할지(단순한 변환/필터) 대 일반 루프를 사용할지(복잡한 로직)를 아는 것은 깔끔하고 읽기 쉬운 코드의 표시입니다.