티스토리 뷰

Python/Python

[Python]컴프리헨션(Comprehension)

Vagabund.Gni 2023. 4. 30. 13:04
728x90
반응형

 

컴프리헨션은 여러 가지 뜻이 있지만, 파이썬의 맥락에서는 '함축'이라는 단어가 가장 어울리는 것 같다.

 

그 뜻대로 파이썬 컴프리헨션이란 리스트, 딕셔너리, 집합 등을 축약해서 만들어주는 기능이다.

 

처음 접할 땐 '뭐 이렇게까지 해야 하나..' 싶지만 일단 익숙해지면 기존의 방식이 되려 거추장스럽다.

 

시작하기 전에, 자바로 입문한 내게 있어 배열 선언과 요소 입력은 아래와 같은 방식이었다.

arr = [0] * 5

for i in range(5):
    arr[i] = input()

print(arr)
['1', '2', '3', '4', '5']

물론 작동은 잘한다.

 

다만 파이썬에는 배열이 따로 없고 리스트가 존재하며, 자바의 배열과 달리 크기가 고정되는 타입이 아니다.

 

그래서 아래와 같이 고쳐서 사용했다.

lst = []

for i in range(5):
    lst.append(input())

print(lst)
['1', '2', '3', '4', '5']

이 자체로도 충분히 잘 돌아가고 가독성 좋은 코드이지만, 컴프리헨션은 위와 같은 표현을,

 

아니 위보다 더 복잡한 표현을 한 줄로 표현할 수 있도록 도와준다.

 

계속해서 리스트, 딕셔너리, 집합의 생성에 컴프리헨션을 적용해 보자.

 

List Comprehension

 

단도직입적으로 위에 들어본 예를 컴프리헨션을 이용해 생성하면 아래와 같이 된다.

lst = [num for num in range(1, 6)]

print(lst)
[1, 2, 3, 4, 5]

코드 세 줄이 한 줄로 줄어들었다.

 

그래서 뭐?

 

하실 분을 위해 이어가자면, 컴프리헨션은 이보다 더 복잡한 작업을 한 번에 처리한다.

 

예를 들어 1부터 10까지 정수 중에 짝수만 담은 리스트를 만든다고 하면 아래와 같이 처리하면 된다.

lst = [num for num in range(1, 11) if num % 2 == 0]

print(lst)
[2, 4, 6, 8, 10]

계속해서 그중에서 6보다 작거나 같은 수만 골라보자. 바로 이어서 적으면 된다.

lst = [num for num in range(1, 11) if num % 2 == 0 if num <= 6]

print(lst)
[2, 4, 6]

물론 2차원 이상의 리스트도 어렵지 않게 만들 수 있다.

 

매우 직관적으로, 그냥 붙여서 쓰면 된다.

lst = [(x, y) for x in range(1, 6) for y in range(1, 6)]

print(lst)
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), 
(2, 1), (2, 2), (2, 3), (2, 4), (2, 5), 
(3, 1), (3, 2), (3, 3), (3, 4), (3, 5), 
(4, 1), (4, 2), (4, 3), (4, 4), (4, 5), 
(5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]

끝으로 조건문을 추가하면 아래와 같은 모양도 만들 수 있다.

lst = [(x, y) for x in range(1, 6) for y in range(1, 6) if x <= 3 if y >= 3]

print(lst)
[(1, 3), (1, 4), (1, 5), 
(2, 3), (2, 4), (2, 5), 
(3, 3), (3, 4), (3, 5)]

 

Dictionary Comprehension

 

딕셔너리는 키:값 구조를 가진 독특한 자료형이다. 하지만 이 부분에만 좀 더 신경 쓰면

 

컴프리헨션으로 생성하는 일 자체는 어려울 것이 조금도 없다.

 

먼저 가장 기본적인 생성방법을 보자. 괄호의 모양이 리스트 시절과는 달라진 걸 놓치면 안 된다.

dic = {num: num**2 for num in range(1, 6)}

print(dic)
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

주어진 범위에서 하나씩 꺼내와 키와 값을 만들어주는 것을 볼 수 있다.

 

이를 비슷하게 응용하면 이미 만들어진 리스트에서 값을 가져와 생성하는 것도 가능하다.

lst = [num for num in range(6, 11)]
dic = {num: num**2 for num in lst}

print(dic)
{6: 36, 7: 49, 8: 64, 9: 81, 10: 100}

다음은 두 개의 리스트를 이용해 딕셔너리를 생성하는 방식이다. zip() 함수가 유용하게 쓰인다.

lst = [num for num in range(1, 6)]
name = ['Gni', 'Dinger', 'Jinguk', 'Dodan', 'Bori']

dic = {key: value for (key, value) in zip(lst, name)}

print(dic)
{1: 'Gni', 2: 'Dinger', 3: 'Jinguk', 4: 'Dodan', 5: 'Bori'}

아주 당연하게도 조건문을 겹쳐 쓰는 것도 언제나 가능하다.

lst = [num for num in range(1, 6)]
name = ['Gni', 'Dinger', 'Jinguk', 'Dodan', 'Bori']

dic = {key: value for (key, value) in zip(lst, name) if key <= 3}

print(dic)
{1: 'Gni', 2: 'Dinger', 3: 'Jinguk'}

 

Set Comprehension

 

집합 컴프리헨션은 중괄호를 쓴다는 점은 딕셔너리와 비슷하지만, 키-값 구조가 아니기 때문에

 

컴프리헨션 생성 자체는 리스트와 크게 다를 것이 없다.

num = {i for i in range(1, 6)}

print(num)
{1, 2, 3, 4, 5}

다만 집합의 특성상 중복을 허용하지 않는다는 차이 정도.

lst = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5}
num = {i for i in lst}

print(num)
{1, 2, 3, 4, 5}

이렇게 해서 파이썬 컴프리헨션에 대해 대략적으로 알아보았다.

 

(웹) 개발을 할 때 사용할 일이 많을까 의문은 들지만, 일단 알고리즘 풀 때는 도움이 되니까

 

더 많이 사용해서 더 많이 익숙해지는 걸 목표로.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함