Intro
파이썬의 컴프리헨션은 데이터 구조를 생성하고 변환하는 데 있어 매우 강력한 도구다.
컴프리헨션을 사용하면 코드의 가독성과 효율성을 크게 향상시킬 수 있으며, 이는 특히 리스트, 딕셔너리, 집합과 같은 데이터 구조를 다룰 때 유용하다.
이 글에서는 리스트 컴프리헨션, 딕셔너리 컴프리헨션, 집합 컴프리헨션을 자세히 살펴보고, 각 컴프리헨션의 활용 예제를 통해 그 유용성을 이해한다.
리스트 컴프리헨션
리스트 컴프리헨션은 기존 리스트를 기반으로 새로운 리스트를 생성하는 방법이다. 일반적인 for 루프를 사용하는 것보다 더 간결하고 읽기 쉬운 코드를 작성할 수 있다. 기본 문법은 다음과 같다.
new_list = [expression for item in iterable if condition]
이 문법을 통해 반복문과 조건문을 한 줄로 처리할 수 있다. 예를 들어, 1부터 10까지의 숫자 중 짝수만 포함하는 리스트를 생성하려면 다음과 같이 작성할 수 있다.
even_numbers = [x for x in range(1, 11) if x % 2 == 0]
이 코드는 range(1, 11)
에서 각 숫자를 순회하며, 짝수인 경우에만 even\_numbers
리스트에 추가한다.
중첩 리스트 컴프리헨션
컴프리헨션은 중첩된 구조에서도 사용할 수 있다. 예를 들어, 2차원 리스트의 모든 요소에 대해 특정 연산을 수행하고 싶다면 다음과 같이 작성할 수 있다.
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
이 코드는 2차원 리스트를 평탄화하여 하나의 리스트로 만든다. 중첩된 컴프리헨션은 복잡한 데이터 구조를 간단하게 변환하는 데 유용하다.
딕셔너리 컴프리헨션
딕셔너리 컴프리헨션은 키-값 쌍으로 구성된 딕셔너리를 생성하는 방법이다.
문법은 리스트 컴프리헨션과 유사하지만, 키와 값의 표현식을 모두 지정해야 한다.
new_dict = {key_expression: value_expression for item in iterable if condition}
예를 들어, 문자열 리스트의 각 문자열을 키로 하고 그 길이를 값으로 하는 딕셔너리를 생성하려면 다음과 같이 작성할 수 있다.
words = ['apple', 'banana', 'cherry']
word_lengths = {word: len(word) for word in words}
이 코드는 각 문자열의 길이를 값으로 하는 딕셔너리를 생성한다.
복잡한 딕셔너리 변환
딕셔너리 컴프리헨션은 복잡한 데이터 변환에도 사용할 수 있다. 예를 들어, 두 개의 리스트를 병합하여 딕셔너리를 생성하려면 다음과 같이 작성할 수 있다.
keys = ['name', 'age', 'city']
values = ['Alice', 25, 'New York']
person_dict = {k: v for k, v in zip(keys, values)}
이 코드는 keys
와 values
리스트를 병합하여 person_dict
라는 딕셔너리를 생성한다.
집합 컴프리헨션
집합 컴프리헨션은 중복되지 않는 요소들로 구성된 집합을 생성하는 방법이다. 문법은 리스트 컴프리헨션과 비슷하다.
new_set = {expression for item in iterable if condition}
예를 들어, 1부터 10까지의 숫자 중 제곱수가 50 이하인 수들로 구성된 집합을 생성하려면 다음과 같이 작성할 수 있다.
squares = {x**2 for x in range(1, 11) if x**2 <= 50}
이 코드는 제곱수가 50 이하인 숫자들로 구성된 집합을 생성한다.
집합의 활용
집합 컴프리헨션은 데이터에서 중복을 제거하거나 특정 조건에 맞는 유일한 값을 추출할 때 유용하다. 예를 들어, 문자열에서 고유한 문자만 추출하려면 다음과 같이 작성할 수 있다.
unique_chars = {char for char in "hello world" if char.isalpha()}
이 코드는 문자열 "hello world"에서 알파벳 문자만 추출하여 고유한 문자 집합을 만든다.
조건부 표현식
컴프리헨션 내에서 조건부 표현식을 사용하여 좀 더 복잡한 로직을 구현할 수 있다. 예를 들어, 홀수는 그대로 두고 짝수는 제곱하여 리스트에 추가하려면 다음과 같이 작성할 수 있다.
numbers = [1, 2, 3, 4, 5]
modified_numbers = [x if x % 2 != 0 else x**2 for x in numbers]
이 코드는 홀수는 그대로 두고 짝수는 제곱한 결과를 포함하는 새로운 리스트를 생성한다. 조건부 표현식을 사용하면 데이터 변환 과정에서 다양한 조건을 적용할 수 있다.
실용 예제
컴프리헨션은 다양한 실용적인 문제 해결에 활용될 수 있다. 예를 들어 주어진 텍스트에서 단어 빈도를 계산하려면 다음과 같이 할 수 있다.
text = "hello world hello"
word_count = {word: text.split().count(word) for word in set(text.split())}
이 코드는 텍스트에서 각 단어의 빈도를 계산하여 딕셔너리에 저장한다.
또한 여러 개의 리스트에서 공통 요소를 추출하는 데도 사용할 수 있다.
list1 = [1, 2, 3]
list2 = [2, 3, 4]
common_elements = {x for x in list1 if x in list2}
이 코드는 두 리스트에서 공통으로 존재하는 요소들을 집합으로 만든다.
성능 고려사항
컴프리헨션은 간결함 외에도 성능 면에서도 이점이 있다. 일반적으로 동일한 작업을 수행하는 for 루프보다 빠르게 실행된다. 그러나 매우 큰 데이터 세트를 처리할 때는 메모리 사용량을 고려해야 한다. 이 경우 제너레이터 표현식을 사용하는 것이 더 적절할 수도 있다.
제너레이터 표현식은 메모리를 절약하면서도 비슷한 구문을 제공한다.
참고: 2024.11.28 - [프로그래밍/파이썬] - 파이썬 - 제너레이터
gen_expr = (x**2 for x in range(1000000))
이 표현식은 필요할 때마다 값을 생성하므로 메모리를 덜 사용한다.
Outro
컴프리헨션은 파이썬 코드의 가독성과 효율성을 높이는 데 큰 도움을 준다. 다양한 데이터 구조에 적용할 수 있으며 복잡한 데이터 변환 작업도 간단하게 처리할 수 있다. 이러한 이유로 많은 파이썬 개발자들이 컴프리헨션을 활용하여 더 나은 코드를 작성하고 있으며 이는 코드 유지보수성에도 긍정적인 영향을 미친다.
'프로그래밍 > 파이썬' 카테고리의 다른 글
파이썬 - 딕셔너리 (0) | 2024.11.29 |
---|---|
파이썬 - 제너레이터 (0) | 2024.11.28 |
파이썬 - 튜플 개념 정리 (0) | 2024.11.26 |
파이썬 - 리스트 메서드 정리 (0) | 2024.11.25 |
파이썬 - 문자열 메서드 정리 (0) | 2024.11.25 |