본문 바로가기
파이썬(Python)/문법 내용정리

Comprehension (List, Set, Dict)

by HealingMusic 2021. 1. 24.

이번 포스팅에서 설명할 개념은 바로 Comprehension 입니다.

Comprehension의 사전적인 뜻은 '이해' 입니다만... 그렇게 이해하는 것보다는 그저 iterable을 효율적으로 표현하는 방법이라고 생각하면 됩니다. Comprehension을 이용하여 표현하면 해당 iterable에 대해 더 직관적으로 표현할 수 있으므로 '이해' 라는 정의에 부합한다고 할 수도 있겠습니다 :)

 

목차

1. List Comprehension

2. Set Comprehension

3. Dict Comprehension

1. List Comprehension

Comprehension은 여러 iterable들에 대해 공통적으로 적용이 가능하지만, 일반적으로는 List를 표현할 때 사용합니다. 그러한 의미에서 List Comprehension에 대해 먼저 알아본 후, 다른 iterable들로 확장해 보도록 하겠습니다.

 

아래는 [1의 제곱, 2의 제곱 , ... , 9의 제곱] 으로 이루어진 리스트를 두 가지 방법으로 생성하고 있습니다.

# 1. for문을 사용하는 기존의 방법
list_1 = []
for i in range(1, 11):
	list_1.append(i ** 2)
    
# 2. List Comprehension을 사용하는 방법
list_2 = [i ** 2 for i in range(1, 11)] # '리턴할 객체' for 'iter' in  '범위'

 

보시는 것처럼 List Comprehension을 사용하면 리스트의 생성이 간단해지고, 이해하는 것도 더 쉽습니다.

이는 Comprehension의 문법 때문인데, 그저 코드를 따라가면서 해석하면 됩니다. 여기서는 'i의 제곱으로 이루어진 코드인데, i는 1부터 11 전까지구나!' 라고 읽으면 됩니다.

 

또한 if문을 사용하여 조금 더 복잡한 경우에 대해서도 표현할 수 있습니다. 아래는 주어진 string을 소문자만 골라서 list[char] 형태로 리턴하는 코드입니다.

string_input = "My Name is HealingCoding"
list_lower = [i for i in string_input if i.islower() == True]
# i인데, i는 string_input의 각 문자이고, i가 소문자인 경우에만 리턴하는구나!

print(list_lower)
# result : ['y', 'a', 'm', 'e', 'i', 's', 'e', 'a', 'l', 'i', 'n', 'g', 'o', 'd', 'i', 'n', 'g']

# 추가) list_lower = [i if i.islower() == True for i in range(1, 11)] 와 같은 구문은 오류가 발생한다.

이처럼 Comprehension을 사용하면 이해하기 쉬운 방식으로 List를 생성할 수 있습니다.

 

또 앞의 Lambda와 마찬가지로, Comprehension에서도 else를 사용할 수 있고, elif는 사용할 수 없습니다.

아래는 리스트의 짝수인 인덱스 위치에 'Even'을, 홀수인 위치에 'Odd'를, 0번째 위치에 'Zero'로 이루어진 리스트를 생성하는 코드입니다.

list_ex = ['Zero' if i == 0 else 'Even' if i % 2 == 0 else 'Odd' for i in range(11)]
# i가 0이면 zero고, 그게 아닌데 i가 짝수면 Even이고, 그거도 아니면 Odd. 그리고 i는 0 ~ 10까지겠구나!
print(list_ex) # ['Zero', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even']

# ['Zero' for i in range(1, 11) if i == 0 else 'Even' if i % 2 == 0 else 'Odd'] # incorrect

주의할 점으로, if문을 하나만 사용하는 경우와는 다르게, if문을 여러 개 사용하는 경우에는 iter의 범위를 마지막에 지정해야 합니다 (for문). 주석의 for문을 앞에 작성한 코드를 보면 약간의 어색함이 느껴집니다.


2. Set Comprehension

Set Comprehension의 생성 방법은 List Comprehension과 완전히 유사합니다.  물론 Set이기 때문에 순서가 의미를 가지지 않으며, 중복을 허용하지 않는다는 것만 다릅니다.

List Comprehension에서 예시로 들었던 코드를 그대로 Set Comprehension으로 옮겨 보겠습니다.

set_ex = {'zero' if i == 0 else 'Even' if i % 2 == 0 else 'Odd' for i in range(11)}
print(set_ex)
# result : {'Odd', 'Zero', 'Even'}

3. Dict Comprehension

Dict Comprehension도 지금까지와 유사합니다. 다만 Dict는 Key와 Value의 두 가지 원소를 가지기 때문에, 두 개의 iter를 이용하여 표현해 주어야 합니다.

아래는 1 ~ 10까지의 홀수와 해당 수의 제곱을 각각 Key와 Value로 하는 Dict를 생성하는 코드입니다.

dict_square = {x : x ** 2 for x in range(1, 11) if x % 2 == 1}
# key : value(=key의 제곱) 꼴인데, key는 1 ~ 10까지이고, 홀수인 경우에만 반영하는구나!

print(dict_square) # {1: 1, 3: 9, 5: 25, 7: 49, 9: 81}

'파이썬(Python) > 문법 내용정리' 카테고리의 다른 글

F-string (가장 강력한 print 방법)  (0) 2021.01.28
Enumerate 함수  (0) 2021.01.27
Lambda Function (람다 함수)  (0) 2021.01.24
Sorted 함수  (0) 2021.01.23
# 00. 카테고리 소개  (0) 2021.01.23

댓글