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와 결합하면 표현력이 크게 늘어납니다. 다만 너무 복잡해지면 그냥 반복문이 읽기 더 좋으니 균형을 잡으세요.