파이썬 공부
들어가며
지난 글에서는 sum, enumerate, zip 등 파이썬에 기본적으로 내장되어 있어 코드를 더욱 간결하고 효율적으로 만들어주는 유용한 내장 함수들에 대해 알아보았습니다. 이러한 함수들을 사용하면 여러 줄에 걸쳐 작성해야 했던 코드를 단 한 줄로 표현할 수 있었습니다.
우리가 프로그래밍을 하면서 가장 흔하게 하는 작업 중 하나는, 기존의 리스트(와 같은 데이터 모음)를 기반으로 특정 조건을 만족하거나 일정한 연산을 거친 새로운 리스트를 만드는 일입니다. 보통 이런 작업은 for 반복문을 사용해왔습니다.
1
2
3
4
5
6
7
8
# 0부터 9까지의 숫자 중에서 짝수만 골라 제곱한 리스트 만들기
even_squares = []
for number in range(10):
if number % 2 == 0:
even_squares.append(number ** 2)
print(even_squares)
# 출력:
이 코드는 명확하지만, 단지 리스트 하나를 만들기 위해 빈 리스트를 선언하고, for문을 돌며 append를 호출하는 과정이 다소 길게 느껴지기도 합니다.
이번 글에서는 이러한 반복 작업을 단 한 줄의 코드로, 더욱 우아하고 직관적으로 표현할 수 있게 해주는 파이썬의 매우 강력하고 독특한 기능, 리스트 컴프리헨션(List Comprehension)에 대해 알아보겠습니다.
리스트 컴프리헨션이란?
리스트 컴프리헨션(List Comprehension, 리스트 내포)은 for 반복문과 if 조건문을 한 줄에 압축하여 새로운 리스트를 생성하는 구문입니다. 마치 수학의 집합 표현식과 유사한 형태를 띠고 있어, 코드의 의도를 명확하게 드러내는 장점이 있습니다.
리스트 컴프리헨션의 기본 구조는 다음과 같습니다.
[표현식 for 항목 in 반복가능객체]
표현식: 리스트의 각 요소에 적용할 연산 (예:number ** 2)for 항목 in 반복가능객체: 기존의for문과 동일한 부분
앞서 for문으로 작성했던 코드를 리스트 컴프리헨션으로 바꿔보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
# 1부터 5까지의 숫자를 각각 제곱한 리스트 만들기
# 1. 일반적인 for문
squares_loop = []
for number in range(1, 6):
squares_loop.append(number ** 2)
print(f"For Loop: {squares_loop}")
# 2. 리스트 컴프리헨션
squares_comp = [number ** 2 for number in range(1, 6)]
print(f"Comprehension: {squares_comp}")
두 결과는 정확히 동일하지만, 리스트 컴프리헨션을 사용한 코드가 훨씬 간결하고, “range(1, 6)의 각 숫자를 제곱하여 리스트를 만든다”는 의도가 한눈에 들어옵니다.
조건문(if) 추가하기
리스트 컴프리헨션의 진정한 힘은 조건문을 결합할 때 나타납니다. for문 뒤에 if 조건을 추가하여, 특정 조건을 만족하는 항목들만 골라서 리스트에 담을 수 있습니다.
[표현식 for 항목 in 반복가능객체 if 조건문]
맨 처음 예제로 들었던 ‘0부터 9까지의 짝수만 골라 제곱한 리스트’를 만들어 보겠습니다.
1
2
3
4
5
6
# 짝수만 골라 제곱한 리스트 만들기
# 리스트 컴프리헨션 + if 조건문
even_squares = [number ** 2 for number in range(10) if number % 2 == 0]
print(even_squares)
# 출력:
for문과 if문, append를 사용했던 네 줄짜리 코드가 단 한 줄로 완성되었습니다.
if-else 까지 활용하기
if문이 필터링의 역할을 했다면, if-else를 이용해 조건에 따라 다른 값을 리스트에 담을 수도 있습니다. 단, 이때는 if-else문의 위치가 for문 앞으로 이동하는 점에 주의해야 합니다.
[True일때_표현식 if 조건문 else False일때_표현식 for 항목 in 반복가능객체]
예를 들어, 1부터 10까지의 숫자 중 홀수이면 ‘홀수’라는 문자열을, 짝수이면 숫자 그대로를 담는 리스트를 만들어 보겠습니다.
1
2
3
4
# if-else를 사용한 리스트 컴프리헨션
result = ['홀수' if number % 2 != 0 else number for number in range(1, 11)]
print(result)
# 출력: ['홀수', 2, '홀수', 4, '홀수', 6, '홀수', 8, '홀수', 10]
왜 리스트 컴프리헨션을 사용할까?
- 간결함: 여러 줄의 코드를 한 줄로 압축하여 코드의 길이를 줄여줍니다.
- 가독성: 익숙해지면, 단순한 리스트 생성을 위한
for문보다 의도가 훨씬 명확하게 보입니다. - 성능: 대부분의 경우, 일반적인
for문과append를 사용하는 것보다 내부적으로 더 빠르게 동작합니다.
물론, for문 안에 여러 개의 if-else문이나 복잡한 로직이 들어가는 경우, 무리하게 리스트 컴프리헨션을 사용하면 오히려 가독성이 떨어질 수 있습니다. 그럴 때는 주저 없이 일반 for문을 사용하는 것이 좋습니다. 모든 도구는 그에 맞는 상황에 사용할 때 가장 빛을 발합니다.
마무리하며
이번 글에서는 for문과 if문을 한 줄에 압축하여 리스트를 생성하는 파이썬의 강력한 기능인 리스트 컴프리헨션에 대해 배웠습니다. 기본 구문부터 if를 이용한 필터링, if-else를 이용한 값의 변환까지 살펴보았습니다. 리스트 컴프리헨션을 잘 활용하면 코드를 더욱 간결하고, 효율적이며, ‘파이썬답게’ 만들 수 있습니다.
우리는 지금까지 def 키워드를 사용해 이름이 있는 함수를 만들고 재사용해왔습니다. 하지만 만약, 단 한 번만 사용하고 버릴 아주 간단한 기능의 함수가 필요하다면 어떨까요? 매번 def로 정식 함수를 정의하는 것은 조금 번거롭게 느껴질 수 있습니다.
다음 글에서는 이름 없이 만드는 익명의 미니 함수, 람다(Lambda) 표현식에 대해 알아보겠습니다. 람다는 특히 다른 함수의 인자로 함수를 전달할 때 리스트 컴프리헨션처럼 코드를 매우 간결하게 만들어주는 역할을 합니다.