티스토리 뷰
목차
프로그래밍을 하다 보면, 더 짧고 효율적인 코드를 작성하고 싶다는 생각이 들 때가 많습니다. 특히 리스트를 다룰 때 반복문과 조건문을 많이 사용하는데, Python에서는 이를 한 줄로 간결하게 표현할 수 있는 리스트 컴프리헨션이라는 강력한 기능이 있습니다. 리스트 컴프리헨션은 처음에는 다소 복잡하게 느껴질 수 있지만, 잘 익혀두면 정말 유용하게 활용할 수 있습니다. 그동안 개발하면서 겪었던 경험으로 볼 때, 리스트 컴프리헨션을 잘 이해하는 것만으로도 코딩의 생산성이 눈에 띄게 향상될 수 있습니다. 부담 갖지 말고, 차근차근 따라해 보세요.
1. 리스트 컴프리헨션이란?
리스트 컴프리헨션(List Comprehension)은 Python에서 리스트를 간결하고 효율적으로 생성하는 방법입니다. 기존의 for 반복문을 활용해 리스트를 생성하는 방법보다 더 짧고 읽기 쉬운 코드 작성을 가능하게 합니다.
1.1 기본 구조
리스트 컴프리헨션의 기본 구조는 다음과 같습니다:
[표현식 for 항목 in iterable]
- 표현식: 리스트에 추가할 항목을 정의합니다.
- 항목: iterable(리스트, 튜플, 문자열 등)의 각 요소를 가리킵니다.
- iterable: 반복 가능한 객체입니다. 리스트, 튜플, 문자열 등이 올 수 있습니다.
예를 들어, 1부터 5까지의 숫자를 포함하는 리스트를 생성하려면 다음과 같이 작성할 수 있습니다:
numbers = [x for x in range(1, 6)]
print(numbers) # 출력: [1, 2, 3, 4, 5]
이 구조는 다음과 같이 풀어 쓸 수 있습니다:
numbers = []
for x in range(1, 6):
numbers.append(x)
리스트 컴프리헨션은 이러한 반복문의 간단한 형태를 한 줄로 표현할 수 있는 강력한 도구입니다.
1.2 리스트 컴프리헨션의 장점
- 가독성: 코드가 간결해지고 직관적이므로, 리스트를 생성하는 목적이 명확하게 드러납니다.
- 성능: 기존의 for 반복문을 사용하는 방식보다 더 빠르게 실행됩니다.
- 유연성: 조건문이나 중첩된 반복문도 사용할 수 있어 복잡한 리스트 생성도 간단하게 처리할 수 있습니다.
2. 리스트 컴프리헨션에 조건문 사용하기
리스트 컴프리헨션은 단순히 반복문을 대체하는 것뿐 아니라, 조건문을 함께 사용하여 더 세밀한 리스트 생성이 가능합니다.
2.1 조건문을 사용한 필터링
리스트 컴프리헨션에서 if 문을 사용하여 특정 조건을 만족하는 요소만 선택할 수 있습니다. 예를 들어, 1부터 10까지의 숫자 중 짝수만 포함하는 리스트를 생성해 보겠습니다:
even_numbers = [x for x in range(1, 11) if x % 2 == 0]
print(even_numbers) # 출력: [2, 4, 6, 8, 10]
- if x % 2 == 0: x가 2로 나누어 떨어지는 경우만 리스트에 추가됩니다.
2.2 조건문과 else를 함께 사용하기
리스트 컴프리헨션에서 if-else 문을 사용하여 특정 조건을 만족하는 경우와 그렇지 않은 경우의 값을 각각 설정할 수도 있습니다.
numbers = [x if x % 2 == 0 else -x for x in range(1, 11)]
print(numbers) # 출력: [-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
- x가 짝수이면 그대로 x를, 홀수이면 -x를 리스트에 추가합니다.
2.3 리스트 컴프리헨션과 중첩 조건문
조건문을 중첩하여 리스트 컴프리헨션을 더 세밀하게 제어할 수 있습니다. 예를 들어, 1부터 20까지의 숫자 중 짝수이면서 4의 배수인 숫자만 포함하는 리스트를 생성해 보겠습니다:
filtered_numbers = [x for x in range(1, 21) if x % 2 == 0 if x % 4 == 0]
print(filtered_numbers) # 출력: [4, 8, 12, 16, 20]
여기서는 두 개의 조건문을 사용하여 리스트에 포함될 항목을 필터링합니다.
3. 리스트 컴프리헨션과 중첩 반복문
리스트 컴프리헨션은 중첩된 반복문도 지원하여 다차원 리스트(예: 행렬)와 같은 복잡한 데이터 구조를 간단하게 생성할 수 있습니다.
3.1 기본 중첩 반복문 사용하기
예를 들어, 1부터 3까지의 숫자와 'A'부터 'C'까지의 알파벳을 조합하여 리스트를 생성해 보겠습니다:
combinations = [(x, y) for x in range(1, 4) for y in ['A', 'B', 'C']]
print(combinations)
# 출력: [(1, 'A'), (1, 'B'), (1, 'C'), (2, 'A'), (2, 'B'), (2, 'C'), (3, 'A'), (3, 'B'), (3, 'C')]
중첩된 for 문을 사용하여 각 숫자와 알파벳의 조합을 튜플 형태로 생성했습니다.
3.2 2차원 리스트 생성
리스트 컴프리헨션을 사용하여 2차원 리스트, 즉 행렬을 쉽게 생성할 수 있습니다. 예를 들어, 3x3 행렬을 다음과 같이 생성할 수 있습니다:
matrix = [[x * y for y in range(1, 4)] for x in range(1, 4)]
print(matrix)
# 출력: [[1, 2, 3], [2, 4, 6], [3, 6, 9]]
이처럼 리스트 컴프리헨션을 활용하면 중첩된 구조도 간단하게 표현할 수 있습니다.
4. 리스트 컴프리헨션 활용 예제
리스트 컴프리헨션은 실제로 다양한 상황에서 활용될 수 있습니다. 몇 가지 실용적인 예제를 통해 리스트 컴프리헨션의 활용 방법을 더 깊이 이해해 보겠습니다.
4.1 문자열에서 특정 문자 제거
문자열에서 특정 문자를 제거하고 새로운 리스트를 생성해 보겠습니다. 예를 들어, 문자열 "Python Programming"에서 공백을 제거해 보겠습니다:
text = "Python Programming"
filtered_text = [char for char in text if char != ' ']
print(filtered_text)
# 출력: ['P', 'y', 't', 'h', 'o', 'n', 'P', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'i', 'n', 'g']
4.2 특정 조건에 맞는 숫자 제곱 값 리스트
리스트 컴프리헨션을 사용하여 1부터 10까지의 숫자 중 홀수의 제곱 값을 저장하는 리스트를 생성해 보겠습니다:
squares = [x**2 for x in range(1, 11) if x % 2 != 0]
print(squares) # 출력: [1, 9, 25, 49, 81]
홀수인 경우에만 해당 숫자의 제곱 값을 리스트에 추가합니다.
4.3 중첩 리스트 평탄화
중첩된 리스트를 하나의 리스트로 평탄화하는 작업도 리스트 컴프리헨션을 통해 쉽게 처리할 수 있습니다:
nested_list = [[1, 2, 3], [4, 5], [6, 7, 8]]
flat_list = [item for sublist in nested_list for item in sublist]
print(flat_list)
# 출력: [1, 2, 3, 4, 5, 6, 7, 8]
이처럼 리스트 컴프리헨션은 간단한 반복문을 활용하여 중첩된 리스트를 처리하는 데 매우 유용합니다.
요약 디스크립션
Python 리스트 컴프리헨션은 코드의 간결성과 효율성을 높이는 강력한 도구입니다. 이 글에서는 리스트 컴프리