리스트 컴프리헨션
for 반복문 + append() 를 한 줄로 축약해 새 리스트를 만들어 주는 파이썬 문법입니다.
읽는 그대로 "리스트를 간결하게(comprehend) 작성한다" 는 뜻이에요.
1. 기본 형태
[ 표현식 for 변수 in 반복가능객체 if 조건식 ]
# ↑ ↑ ↑
# 새 값 기존 요소 하나씩 (선택) 필터
표현식 : 최종 리스트에 담길 값(가공 결과(
for-in : 기존 시퀀스(리스트, 튜플, range 등)를 순회
if 필터(선택) : 조건을 만족하는 요소만 포함.
2. 전통적 방법 vs 리스트 컴프리헨션
0~9의 제곱값 구하기를 해봅시다
전통적 방법 (for-loop + append())
# 새 빈 리스트 준비
squares = []
# range(10)은 0부터 9까지 숫자를 순회합니다.
for n in range(10):
# ① n**2 로 제곱값 계산
# ② 계산 결과를 squares 리스트 끝에 추가
squares.append(n ** 2)
print(squares) # → [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
해설
- range(10)이 0,1,2 … 9를 순서대로 반환합니다.
- 루프가 돌아갈 때마다 n에 한 숫자가 들어옵니다.
- n ** 2로 제곱을 계산합니다.
- append()로 리스트 뒤에 붙입니다.
- 루프가 끝나면 제곱값 10개가 저장됩니다.
리스트 컴프리헨션 버전
squares = [n ** 2 for n in range(10)]
print(squares) # → [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
해설
- for n in range(10) : 0~9를 순회하면서 n을 받습니다.
- 표현식 n ** 2 : n이 바뀔 때마다 제곱값을 계산합니다.
- 계산된 값들이 대괄호 [] 안으로 바로 들어가 새 리스트가 생성됩니다.
- 루프와 append()가 눈에 보이지 않지만 내부적으로 동일한 동작을 수행하며, 한 줄에 표현돼 가독성이 높아집니다.
아래와 같이 조건문도 추가해서 넣을 수 있습니다.
기존 방법
evens = []
for n in range(10):
# 짝수인지 검사
if n % 2 == 0:
evens.append(n)
print(evens) # → [0, 2, 4, 6, 8]
리스트 컴프리헨션
evens = [n for n in range(10) if n % 2 == 0]
print(evens) # → [0, 2, 4, 6, 8]
3. 작동 과정(내부 흐름) ― 한 요소가 리스트에 들어오기까지
- 반복(iteration)
- 시퀀스의 첫 번째 요소를 읽어 변수에 바인딩합니다.
- 조건 필터링(선택)
- if 조건이 있다면, 조건식을 평가합니다.
- False면 건너뛰고 다음 루프로 진행합니다.
- 표현식 계산
- 변수 값을 사용해 표현식을 평가합니다.
- 새 리스트에 추가
- 계산 결과를 리스트에 즉시 기록합니다.
- 모든 요소를 소비할 때까지 1~4 과정을 반복한 후 리스트를 반환합니다.
4. 응용: 중첩 루프·다른 컬렉션 컴프리헨션
4-A. 2차원 리스트 평탄화(flatten)
matrix = [[1, 2], [3, 4], [5, 6]]
flat = [item # 최종 저장될 값
for row in matrix
for item in row]
# 내부적으로는 중첩 for-loop와 동일
print(flat) # → [1, 2, 3, 4, 5, 6]
4-B. 딕셔너리 컴프리헨션
squares_dict = {n: n ** 2 for n in range(5)}
# → {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
4-C. 집합(set) 컴프리헨션
words = ["apple", "banana", "kiwi"]
lengths = {len(w) for w in words} # 중복 제거
# → {5, 6}
5. 장점과 주의사항 (상세 버전)
구분 | 내용 |
장점 | 1) 코드가 짧고 의도가 한눈에 보입니다. 2) 내부 루프가 C로 구현돼 있어 append() 루프보다 약간 빠릅니다. 3) 조건식·중첩 루프·다른 컬렉션(dict, set)도 동일 문법으로 표현 가능. |
주의 | 1) 너무 길거나 중첩이 깊으면 가독성이 떨어집니다. → “한 줄에 담을 수 있는 간단한 변환”에만 쓰고, 복잡하면 전통적 for-loop가 낫습니다. 2) 디버깅 시 중간 값을 찍기 어렵습니다. 필요하면 loop로 풀어서 확인하세요. |
반응형
'웹 개발 > 🐍 Python' 카테고리의 다른 글
Python 정규표현식 re.match 사용법 (1) | 2025.07.01 |
---|---|
Python 타입 힌트 (0) | 2025.07.01 |
파이썬 .env 사용법 (0) | 2025.05.16 |
python | fastAPI uvicorn gunicorn 배포하기 (0) | 2025.05.14 |
파이썬 가상환경 경로변경시 activate 안되는 문제 (0) | 2025.05.14 |