컴프리헨션이란?
컴프리헨션(comprehension)은 파이썬에서 반복문과 조건식을 한 줄로 압축해 새로운 시퀀스를 손쉽게 생성할 수 있는 문법입니다. 기존 자료구조를 변환하거나 필터링할 때 특히 유용하며, 코드가 간결해지고 가독성도 크게 향상됩니다.
파이썬에서 사용할 수 있는 컴프리헨션은 다음 네 가지입니다.
- 리스트 컴프리헨션(List Comprehensions)
- 딕셔너리 컴프리헨션(Dictionary Comprehensions)
- 셋(Set) 컴프리헨션
- 제너레이터 컴프리헨션(Generator Comprehensions)
1. 리스트 컴프리헨션
리스트는 다양한 방법으로 생성할 수 있으며, 생성된 요소에는 인덱스나 반복문을 통해 자유롭게 접근할 수 있습니다.
for 반복문으로 만들기
# 빈 리스트 생성
listA = []
# 요소 추가하기
for n in range(4, 9):
listA.append(n ** 3)
print("for 반복문으로 만든 리스트:\n", listA)
실행 결과
for 반복문으로 만든 리스트: [64, 125, 216, 343, 512]
위 코드는 4부터 8까지의 숫자를 차례대로 세제곱한 뒤 리스트에 저장합니다.
기존 리스트에서 새 리스트 만들기
컴프리헨션 문법을 사용하면 기존 리스트의 요소 중 원하는 값만 골라 새로운 리스트를 한 줄로 생성할 수 있습니다.
# 기존 리스트
listA = [12, 9, 32, 45]
print("주어진 리스트:\n", listA)
# 3으로 나누어떨어지는 요소만 추출
new_list = [n for n in listA if n % 3 == 0]
print("새로운 리스트:\n", new_list)
실행 결과
주어진 리스트: [12, 9, 32, 45] 새로운 리스트: [12, 9, 45]
2. 딕셔너리 컴프리헨션
딕셔너리는 키(key)와 값(value)이 한 쌍을 이루는 자료구조입니다. 컴프리헨션을 활용하면 두 개의 리스트를 결합하거나 조건에 맞는 데이터로 딕셔너리를 손쉽게 구성할 수 있습니다.
for 반복문과 zip 함수 사용하기
키가 될 리스트와 값이 될 리스트를 준비한 뒤, zip() 함수로 묶어 딕셔너리를 생성합니다.
Day = ['Mon', 'Tue', 'Wed']
Time = ['2pm', '10am', '11am']
# 빈 딕셔너리 생성
dictA = {}
# zip으로 키-값 쌍 만들기
for (key, value) in zip(Day, Time):
dictA[key] = value
print("for 반복문으로 만든 딕셔너리:\n", dictA)
실행 결과
for 반복문으로 만든 딕셔너리:
{'Mon': '2pm', 'Tue': '10am', 'Wed': '11am'}
리스트 요소를 키로 사용하기
리스트의 각 요소를 키로 삼고, 수식을 이용해 해당 키의 값을 계산하는 방식입니다.
listA = [3, 5, 4, 8, 9, 2]
dictA = {}
# 홀수만 골라 세제곱한 값을 저장
for key in listA:
if key % 2 != 0:
dictA[key] = key ** 3
print("for 반복문으로 만든 딕셔너리:\n", dictA)
실행 결과
for 반복문으로 만든 딕셔너리:
{3: 27, 5: 125, 9: 729}
3. 셋(Set) 컴프리헨션
파이썬의 셋(set)은 중복 없는 고유한 요소만 저장하는 자료형입니다. 리스트와 유사한 방식으로 생성할 수 있습니다.
for 반복문 사용하기
리스트에 조건을 적용해 일부 요소를 추출한 후, add() 메서드로 비어 있는 셋에 하나씩 담습니다.
listA = [12, 4, 25, 12, 4, 9]
setA = set()
# 3의 배수만 추출
for x in listA:
if x % 3 == 0:
setA.add(x)
print("for 반복문으로 만든 셋:", setA)
실행 결과
for 반복문으로 만든 셋: {9, 12}
중괄호 안에서 for와 in 사용하기
중괄호({ }) 안에 직접 for 반복문을 작성하고 그 결과를 셋에 바로 할당하는 방법입니다.
listA = [12, 4, 25, 12, 4, 9]
# 짝수만 추출
setA = {x for x in listA if x % 2 == 0}
print("컴프리헨션으로 만든 셋:", setA)
실행 결과
컴프리헨션으로 만든 셋: {12, 4}
4. 제너레이터 컴프리헨션
리스트의 요소에 조건을 적용한 뒤 소괄호(( )) 안의 for 반복문으로 감싸면 제너레이터가 됩니다. 제너레이터는 전체 결과를 메모리에 미리 만들어 두지 않고 필요할 때 값을 하나씩 꺼내 쓰기 때문에, 대량의 데이터를 처리할 때 특히 효율적입니다.
listA = [12, 4, 25, 12, 4, 9]
genrtr = (var for var in listA if var % 2 == 0)
print("제너레이터 컴프리헨션으로 얻은 값:\n")
for x in genrtr:
print(x, end=',')
실행 결과
제너레이터 컴프리헨션으로 얻은 값: 12,4,12,4,
마무리
컴프리헨션은 파이썬답게(Pythonic) 코드를 작성하는 핵심 문법입니다. 상황에 따라 다음과 같이 선택하면 좋습니다.
- 전체 결과를 즉시 사용해야 한다면 → 리스트·딕셔너리·셋 컴프리헨션
- 메모리를 절약하며 하나씩 처리하고 싶다면 → 제너레이터 컴프리헨션