본문 바로가기
프로그래밍/파이썬

파이썬 - 컴프리헨션

by ennak 2024. 11. 27.
반응형

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)}  

 

이 코드는 keysvalues 리스트를 병합하여 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