Application/Python

[Python] 파이썬 리스트 컴프리헨션, 코드 한 줄로 줄이는 마법

devsalix 2026. 5. 13. 14:10
728x90

파이썬 리스트 컴프리헨션, 코드 한 줄로 줄이는 마법

파이썬으로 쓴 다른 사람 코드를 보다 보면, 가끔 이런 한 줄을 만나게 되실 거예요.

[x ** 2 for x in range(10)]

 

처음 보면 진짜 외계어 같죠. 저도 처음엔 이게 뭐지 싶었거든요. 분명 파이썬 코드인데 평소에 배운 문법이랑 모양이 너무 달라 보이잖아요.

그런데 알고 보면 별거 아니에요. 그냥 for 루프를 한 줄로 압축해놓은 것뿐이거든요. 이걸 리스트 컴프리헨션(list comprehension)이라고 부르는데, 익숙해지면 코드가 훨씬 깔끔해져요. 클래스 얘기로 머리가 좀 무거우셨을 텐데, 오늘은 분위기 바꿔서 가볍게 코드 줄이는 기법 하나 살펴볼게요.


일단 평범한 for 루프부터

리스트 컴프리헨션을 이해하려면, 먼저 우리가 평소에 어떻게 리스트를 만들어왔는지 떠올려봐야 해요. 1부터 5까지의 제곱수를 리스트로 만들고 싶다고 해볼게요.

# 빈 리스트를 먼저 만들고
squares = []

# for 루프를 돌면서 하나씩 채워 넣어요
for x in range(1, 6):
    squares.append(x ** 2)

print(squares)  # [1, 4, 9, 16, 25]

 

세 단계로 일하잖아요. 빈 리스트 만들고, 반복 돌리고, 하나씩 추가하고. 이 패턴이 진짜 자주 나옵니다. 너무 자주 나오니까 파이썬은 이걸 한 줄로 쓸 수 있게 해놨어요.


파이썬 리스트 컴프리헨션 기본 문법

위 코드를 컴프리헨션으로 바꾸면 이렇게 돼요.

# 한 줄로 끝
squares = [x ** 2 for x in range(1, 6)]

print(squares)  # [1, 4, 9, 16, 25]

 

기본 구조는 이래요.

[표현식  for 변수  in 반복가능객체]

 

읽는 순서가 좀 특이한데, 뒤쪽의 for x in range(1, 6)을 먼저 보시면 돼요. "1부터 5까지 x를 하나씩 꺼낼 건데, 그때마다 x ** 2를 리스트에 넣어줘." 이렇게 읽히는 거죠.

처음엔 이 읽는 순서가 어색하실 텐데, 몇 번 써보면 금방 익숙해지세요.


조건을 걸어서 골라내기

여기에 if를 뒤에 붙이면 필터링이 됩니다. 짝수만 골라보고 싶다고 해볼게요.

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# n을 하나씩 꺼내되, 2로 나눠 떨어지는 애들만 넣어줘
evens = [n for n in nums if n % 2 == 0]

print(evens)  # [2, 4, 6, 8, 10]

 

빨래 바구니에서 흰 옷만 골라 빨래줄에 너는 느낌이라고 보시면 돼요. 조건이 True인 애들만 새 리스트에 들어가는 거죠.


값을 가공해서 넣기

표현식 자리에는 어떤 식이든 올 수 있어요. 그러니까 단순히 그대로 담는 게 아니라 가공해서 담을 수도 있다는 뜻이에요.

words = ["python", "list", "comprehension"]

# 전부 대문자로 바꿔서 새 리스트 만들기
upper_words = [w.upper() for w in words]
print(upper_words)  # ['PYTHON', 'LIST', 'COMPREHENSION']

# 각 단어의 길이만 모아서 리스트로
lengths = [len(w) for w in words]
print(lengths)  # [6, 4, 13]

 

공장 컨베이어 벨트 같아요. 들어오는 부품마다 똑같은 가공을 해서 다음 칸으로 보내는 거죠.


if-else는 앞에 와요 (헷갈리는 부분)

여기서부터 조금 헷갈리실 수 있는데요, if만 단독으로 쓸 땐 뒤에, if-else 둘 다 쓸 땐 앞에 옵니다.

nums = [1, 2, 3, 4, 5]

# 짝수면 "짝수", 아니면 "홀수"로 바꿔서 담기
labels = ["짝수" if n % 2 == 0 else "홀수" for n in nums]

print(labels)  # ['홀수', '짝수', '홀수', '짝수', '홀수']

 

차이를 정리하면 이래요.

  • 뒤쪽 if 조건걸러내기 (조건 맞는 것만 남김)
  • 앞쪽 if 조건 else 값값 바꾸기 (모든 요소가 들어가되 값이 달라짐)

이 둘이 진짜 헷갈리거든요. 저도 자주 헷갈리는데, "뒤 if는 거르기, 앞 if-else는 갈아끼우기"로 외워두시면 편해요.


너무 욱여넣지는 마세요

리스트 컴프리헨션이 멋있어 보인다고 모든 걸 한 줄에 욱여넣으면, 오히려 읽기 어려운 코드가 됩니다.

# 이건 좀... 한 줄에 너무 많아요
result = [x * 2 if x % 2 == 0 else x * 3 for x in range(100) if x > 10 and x < 50]

 

이 정도 되면 그냥 일반 for 루프로 풀어 쓰는 게 훨씬 읽기 좋아요. 파이썬 한 줄 코드로 줄이는 게 목표가 아니라, 명확하게 읽히는 게 목표거든요. 헷갈리는 순간 컴프리헨션의 장점은 사라집니다.

그리고 print()처럼 결과 값이 의미 없는 작업을 컴프리헨션에 넣는 것도 피하셔야 해요. 리스트를 만드는 문법인데 리스트가 필요 없다면 그냥 for 루프 쓰세요.


딕셔너리도 같은 방식으로

비슷한 문법으로 딕셔너리도 한 줄에 만들 수 있어요. 대괄호 대신 중괄호, 그리고 키: 값 형태로 쓰면 됩니다.

fruits = ["사과", "바나나", "포도"]

# 과일 이름을 키로, 글자 수를 값으로
fruit_len = {f: len(f) for f in fruits}

print(fruit_len)  # {'사과': 2, '바나나': 3, '포도': 2}

 

이걸 딕셔너리 컴프리헨션이라고 부르는데, 쓰임새가 꽤 많아요.


직접 해보실 과제

1부터 100까지의 숫자 중에서 3의 배수만 모은 리스트를 리스트 컴프리헨션으로 만들어보세요. 힌트 드리자면 range(1, 101)% 3 == 0을 활용하시면 됩니다. 한 줄로 끝낼 수 있어요.

답이 안 풀리시면 댓글로 남겨주세요.


다음 글 예고

리스트 컴프리헨션이 코드를 줄이는 한 가지 방법이라면, 비슷한 목적을 가진 다른 도구도 있어요. 다음 글에서는 lambda라는 익명 함수와 map, filter라는 함수를 살펴볼 건데요. 이게 컴프리헨션이랑 어떻게 다른지, 언제 뭘 쓰는 게 좋은지 비교해보면 꽤 재밌으실 거예요.


 


제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀

 

 
728x90