- 리스트 컴프리헨션
- for → 오른쪽 if (필터) → 왼쪽 연산 (변형)
- for 문 : Iterator로부터 원소를 하나씩 공급받는 단계
- 오른쪽 if x > 2 : filter 단계. 조건에 맞지 않는 원소는 Expression 단계로 넘어가지 못하고 탈락(Discard)함
- 그래서 3,4,5만 살아남
- 왼쪽 조건부 연산 (Conditional Expression) : map 단계이자 Ternary Operator(삼항 연산자)가 적용되는 구간
nums = [1, 2, 3, 4, 5]
result = [x * 2 if x % 2 == 0 else x * 3 for x in nums if x > 2]
print(result) # [9, 8, 15]
old_inventory = {"apple": 500, "banana": 2000, "cherry": 3000}
new_inventory = {(key+'_sale'):int(value*0.9) for key, value in old_inventory.items() if value >= 1000}
print(new_inventory)
- Generator와 공간 복잡도
- 리스트 컴프리헨션
- Eager Evaluation (즉시 평가)
- [i for i in range(1000000)]을 실행하는 순간 메모리에는 100만개의 숫자가 즉시 할당됨
- 만약 이것이 10GB 분량의 데이터인데 현재 가용 가능한 RAM(메모리)이 4GB 뿐이라면?
- but 파이썬은 해당 데이터를 전부 메모리(RAM)에 한꺼번에 올리려고 시도함!
- → 운영체제는 더이상 메모리를 줄 수 없다고 선언함 : MemoryError → 프로그램 즉시 강제 종료
- 제너레이터 (Generator)
- (i for i in range(1000000))처럼 소괄호를 쓰거나 함수 내에서 yield 사용
- 데이터를 미리 다 만들어두지 않고, '다음 데이터가 필요할 때 그제야 계산해서 하나씩 내어주는' 방식
- Lazy Evaluation (지연 평가)
- 데이터가 1억 개든 100억 개든, 제너레이터는 현재 값 하나를 계산할 정도의 상수 시간 공간 복잡도 O(1)만 점유함
- 리스트 컴프리헨션
- 중첩 리스트 컴프리헨션 (Nested List Comprehension)
matrix = [[i for i in range(2)] for j in range(3)]
print(matrix)
# [[0,1],[0,1],[0,1]]
- Outer Loop (외부 루프): for j in range(3)
- 행을 생성하는 역할
- 전체 리스트의 길이를 결정하며 총 3개의 원소를 품게 됨
- Inner Loop (내부 루프): [i for i in range(2)]
- 외부 루프가 한번 돌 때마다 실행되는 하나의 독립적인 리스트 생성식
- 행의 내부 데이터, 즉 열을 생성함
colors = ["Red", "Pink"]
items = ["Cup", "Pen", "Bag"]
combined = [f"{c}-{i}" for c in colors for i in items if "e" in c or "a" in i]
print(len(combined)) # 4
# "Red-Cup"
# "Red-Pen"
# "Red-Bag"
# "Pink-Bag"
'Python 공부' 카테고리의 다른 글
| 타입 힌트, is 연산자 vs == 연산자 (0) | 2026.01.09 |
|---|---|
| SQL + Python 연동 (0) | 2026.01.09 |
| Truthiness (참 같은 값), Truthy/Falsy, 단락평가 (0) | 2026.01.09 |
| 가변 (Mutable) vs 불변 (Immutable) (0) | 2026.01.09 |
| isalpha, isdigit, isinstance 함수 (0) | 2026.01.09 |