티스토리 뷰
목차
컴프리헨션은 여러 가지 뜻이 있지만, 파이썬의 맥락에서는 '함축'이라는 단어가 가장 어울리는 것 같다.
그 뜻대로 파이썬 컴프리헨션이란 리스트, 딕셔너리, 집합 등을 축약해서 만들어주는 기능이다.
처음 접할 땐 '뭐 이렇게까지 해야 하나..' 싶지만 일단 익숙해지면 기존의 방식이 되려 거추장스럽다.
시작하기 전에, 자바로 입문한 내게 있어 배열 선언과 요소 입력은 아래와 같은 방식이었다.
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}
이렇게 해서 파이썬 컴프리헨션에 대해 대략적으로 알아보았다.
(웹) 개발을 할 때 사용할 일이 많을까 의문은 들지만, 일단 알고리즘 풀 때는 도움이 되니까
더 많이 사용해서 더 많이 익숙해지는 걸 목표로.
'Python > Python' 카테고리의 다른 글
[Python]__init__.py에 대하여 (0) | 2023.08.21 |
---|---|
[Python]전략패턴 (0) | 2023.08.15 |
[Python]enumerate() 내장함수 (0) | 2023.05.21 |
[Python]파이썬으로 팩토리얼 구하기, 네 가지 방법 (0) | 2023.04.12 |
[Python]최대공약수, 최소공배수 (3) | 2023.04.09 |
[Python]set 자료형 각종 연산 (1) | 2023.04.08 |
- Total
- Today
- Yesterday
- BOJ
- java
- 칼이사
- 야경
- 유럽여행
- 세계일주
- RX100M5
- spring
- 자바
- Algorithm
- Backjoon
- 지지
- 백준
- 세계여행
- 동적계획법
- 면접 준비
- 알고리즘
- 중남미
- 파이썬
- 스트림
- 스프링
- 맛집
- 세모
- 기술면접
- 남미
- Python
- 여행
- a6000
- 유럽
- 리스트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |