10. 리스트 컴프리헨션 — 더 나아가기
리스트뿐 아니라 딕셔너리, 셋도 컴프리헨션으로 만들 수 있어요. 여기서 컴프리헨션을 한 단계 더 확장해봅니다.
딕셔너리 컴프리헨션
{키: 값 for ...} 형태로 쓰면 딕셔너리가 만들어집니다. 콜론(:)으로 키와 값을 구분해요.
squares = {x: x * x for x in range(5)}
print(squares) # 출력: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
셋 컴프리헨션
중괄호 {} 안에 콜론 없이 값만 쓰면 셋이 됩니다. 셋이라서 중복은 자동으로 제거돼요.
remainders = {x % 3 for x in range(10)}
print(remainders) # 출력: {0, 1, 2}
중첩 컴프리헨션
컴프리헨션 안에 다시 컴프리헨션을 넣어 2차원 리스트를 만들 수 있어요. 3x3 0으로 채운 격자를 이렇게 만듭니다.
grid = [[0] * 3 for _ in range(3)]
print(grid) # 출력: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
반대로 2차원 리스트를 1차원으로 펼치는 평탄화도 가능해요. for를 두 번 나열하면 바깥 반복부터 순서대로 돕니다.
grid = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [x for row in grid for x in row]
print(flat) # 출력: [1, 2, 3, 4, 5, 6, 7, 8, 9]
조건 표현식 결합
if-else를 값 자리에 넣으면 조건에 따라 다른 값을 넣을 수 있어요. 여기서 위치가 중요합니다.
if-else(값을 고르는 조건):for앞에 옵니다.- 필터용
if(걸러내는 조건):for뒤에 옵니다.
nums = [-2, 3, -1, 5, 0]
# 음수는 0으로 바꾸기 → if-else 는 for 앞
result = [x if x > 0 else 0 for x in nums]
print(result) # 출력: [0, 3, 0, 5, 0]
enumerate 와 결합
enumerate를 쓰면 인덱스와 값을 함께 꺼낼 수 있어요. (인덱스, 값) 튜플 리스트를 만들 때 유용합니다.
arr = ['a', 'b', 'c']
pairs = [(i, v) for i, v in enumerate(arr)]
print(pairs) # 출력: [(0, 'a'), (1, 'b'), (2, 'c')]
💡 컴프리헨션은 리스트 전용이 아니에요. 딕셔너리·셋으로도 확장되고, 중첩·조건 표현식·
enumerate와 결합하면 표현력이 크게 늘어납니다. 다만 너무 복잡해지면 그냥 반복문이 읽기 더 좋으니 균형을 잡으세요.