리스트 컴프리헨션 — 한 줄로 리스트 만들기
이 토픽을 마치면
for문 4줄을 1줄로 바꾸는 리스트 컴프리헨션 문법을 알게 되고, 조건 필터링과 딕셔너리 컴프리헨션까지 사용할 수 있습니다.
for문이 반복되는 패턴
리스트를 만들 때 이런 코드를 자주 씁니다:
numbers = [1, 2, 3, 4, 5]squares = []for n in numbers: squares.append(n ** 2)
print(squares) # [1, 4, 9, 16, 25]4줄입니다. 빈 리스트 만들고, for문 돌리고, append하고. 이 패턴이 계속 반복됩니다. Python은 이걸 한 줄로 줄이는 문법을 제공합니다:
squares = [n ** 2 for n in numbers]이것이 리스트 컴프리헨션(list comprehension)입니다.
구조
[표현식 for 변수 in 반복가능한것]읽는 방법: "반복가능한 것에서 변수를 하나씩 꺼내서, 표현식을 적용한 결과로 리스트를 만든다."
# 문자열을 대문자로names = ['alice', 'bob', 'charlie']upper = [name.upper() for name in names]# ['ALICE', 'BOB', 'CHARLIE']
# 문자열 길이lengths = [len(name) for name in names]# [5, 3, 7]
# 1부터 10까지nums = [i for i in range(1, 11)]# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]조건 필터링 — if 추가
[표현식 for 변수 in 반복가능 if 조건]numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 짝수만evens = [n for n in numbers if n % 2 == 0]# [2, 4, 6, 8, 10]
# 3보다 큰 수의 제곱big_squares = [n ** 2 for n in numbers if n > 3]# [16, 25, 36, 49, 64, 81, 100]if는 필터 역할입니다. 조건에 맞는 것만 결과에 포함됩니다.
for문으로 쓰면:
evens = []for n in numbers: if n % 2 == 0: evens.append(n)5줄이 1줄이 됩니다.
if-else — 조건부 변환
필터가 아니라 변환을 하고 싶으면 if-else를 앞에 넣습니다:
# 짝수면 "짝", 홀수면 "홀"labels = ["짝" if n % 2 == 0 else "홀" for n in range(1, 6)]# ['홀', '짝', '홀', '짝', '홀']위치가 다릅니다:
- 필터(제외):
[x for x in lst if 조건]— if가 뒤에 - 변환(선택):
[A if 조건 else B for x in lst]— if-else가 앞에
딕셔너리 컴프리헨션
중괄호로 감싸면 딕셔너리를 만듭니다:
names = ['alice', 'bob', 'charlie']name_len = {name: len(name) for name in names}# {'alice': 5, 'bob': 3, 'charlie': 7}# 값 뒤집기original = {'a': 1, 'b': 2, 'c': 3}flipped = {v: k for k, v in original.items()}# {1: 'a', 2: 'b', 3: 'c'}세트 컴프리헨션
중괄호 + 값만 넣으면 세트입니다:
words = ['hello', 'world', 'hello', 'python']unique_lengths = {len(w) for w in words}# {5, 6}가독성 경고
# 이건 괜찮습니다result = [x * 2 for x in range(10) if x % 2 == 0]
# 이건 읽기 어렵습니다result = [f(x, y) for x in range(10) for y in range(10) if x != y if g(x, y) > threshold]컴프리헨션이 한 줄에 다 안 들어오거나, 중첩 for문 + 조건이 2개 이상이면 일반 for문으로 쓰는 게 낫습니다. 짧은 코드가 항상 좋은 코드는 아닙니다. 읽을 수 있는 코드가 좋은 코드입니다.
핵심
리스트 컴프리헨션은
[표현식 for 변수 in 반복 if 조건]한 줄로 리스트를 만드는 문법입니다. 필터링은if를 뒤에, 조건부 변환은if-else를 앞에 놓습니다.{}+key: value면 딕셔너리,{}+ 값만이면 세트 컴프리헨션. 한 줄에 다 못 넣으면 for문으로 쓰세요 — 가독성이 우선입니다.