티스토리 뷰
comprehension
반복 가능한 iterable 자료형을 생성할 때 사용한다. 여러 줄에 걸쳐서 만드는 for문이나 if조건문을 포함하는 경우에도 한 줄로 간단하게 표현할 수 있다. 표현식을 간편하게 사용할 수 있어서 리스트를 생성할 때 자주 사용되고 리스트뿐만 아니라 set, dict 자료형도 동일한 방식으로 생성할 수 있다.
- 순서 -
1. list comprehension
1) for문을 한 줄로 표현
2) 두 개의 for문을 한 줄로 표
3) if조건문을 사용
4) if - else 조건문을 사용
2. set comprehension
3. dictionary comprehension
1. list comprehension
1-1) for문을 한줄로 표현
[ 출력 값 표현 for 요소 in 요소를 꺼내올 데이터 ] 형태로 사용한다. for문과 list comprehension을 비교한 예시
예시 1 1 ~ 10 숫자 리스트 생성
# for문
nums = []
for x in range(1, 11) :
nums.append(x)
# list comprehension
nums = [x for x in range(1, 11)]
# nums 출력값
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
예시 2 1 ~ 10의 제곱 값으로 이루어진 리스트 생성
# for문
nums2 = []
for x in range(1, 11):
nums2.append(x*x)
# list comprehension
nums2 = [x*x for x in range(1, 11)]
- list comprehension 표현식의 for 앞부분에서 원하는 출력 값을 표현하면 된다.
# nums2 출력값
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
예시 3 1 ~ 10 사이의 임의의 수 5개로 이루어진 리스트 생성
import random # random 모듈 불러옴
# for문
nums3 = []
for _ in range(5) :
nums3.append(random.randint(1, 10))
# list comprehension
nums3 = [random.randint(1, 10) for _ in range(5)]
- 표현식에서 for과 in사이에 요소의 값이 의미가 없는 경우에는 언더바( _ )로 표시해도 무관하다.
# nums3 출력값
[6, 10, 1, 1, 6]
1-2) 두 개의 for문을 한 줄로 표현
[ 출력 값 for 요소 1 in 데이터 1 for 요소 2 in 데이터 2 ] 형태로 사용한다.
예시 1 구구단 2 ~ 9단을 출력
# for문
for dan in range(2, 10): # 2 ~ 9
for i in range(1, 10): # 1 ~ 9
print(f'{dan} x {i} = {dan * i}')
# list comprehension
[print(f'{dan} x {i} = {dan*i}') for dan in range(2, 10) for i in range(1, 10)]
- 2개 이상의 for문에서 마지막 for문부터 먼저 반복하는 것과 동일하게 comprehension 안에 마지막 for문부터 반복한다.
# 2 ~ 9단 출력값
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
...
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81
예시 2 2개의 숫자 원소리 스트로 이루어진 2차원 리스트를 생성
# for문
nums4 = []
for x1 in range(1, 6) :
for x2 in range(91, 96):
nums4.append([x1, x2])
# list comprehension
nums4 = [[x1, x2] for x1 in range(1, 6) for x2 in range(91, 96)]
- x1, x2를 괄호로 묶어 튜플로 생성한다던가 in뒤의 숫자 범위를 문자열 데이터로 바꾼다던가 하는 응용이 가능하다.
# nums4 출력값
[[1, 91], [1, 92], [1, 93], [1, 94], .... [5, 92], [5, 93], [5, 94], [5, 95]]
1-3) if조건문을 사용
if조건문이 for문 뒤에 위치한다. [ 출력 값 for 요소 in 데이터 if 조건 ] 형태로 사용한다.
예시 1 임의의 숫자 리스트에서 짝수로만 이루어진 리스트 생성
scores = [20, 55, 12, 7, 6]
nums5 = []
for x in scores:
if x % 2 == 0:
nums5.append(x)
nums5 = [x for x in scores if x % 2 == 0]
# nums5 출력 값
[20, 12, 6]
예시 2 임의의 문자열 리스트에서 글자 수가 2개인 문자만 두 번 반복해서 출력
words = ['반짝','하하','별','호호호']
# for문
words2 = []
for x in words :
if len(x) == 2 :
words2.append(x+x)
# list comprehension
words2 = [x+x for x in words if len(x) == 2]
# words2 출력값
['반짝반짝', '하하하하']
1-4) if - else 조건문을 사용
if - else 조건문이 for문 앞에 위치한다. [ 출력 값 1 if 조건식 else 출력값2 for 요소 in 데이터 ] 형태로 사용한다. 출력 값 1 자리에는 if조건문에 해당하는 출력 값을 입력하고 출력 값 2 자리에는 else에 해당하는 출력 값을 입력한다.
예시 1 임의의 문자열 리스트에서 글자 수가 2개이면 두 번 반복하고 2개가 아니면 문자 그대로 출력한다.
words = ['반짝','하하','별','호호호']
words3 = []
for x in words :
if len(x) == 2 :
words3.append(x+x)
else:
words3.append(x)
words3 = [x+x if len(x) == 2 else x for x in words]
# words3 출력값
['반짝반짝', '하하하하', '별', '호호호']
2. set comprehension
set 자료형을 생성할 때 사용한다. comprehension 표현식을 사용할 때 중괄호 { }로 묶어준다. 이외에 사용방법은 list comprehension과 비슷하지만 집합 자료형의 특성상 순서가 없고 unique 한 값만 가진다.
[ set 자료형 특성에 대한 설명 바로가기 ]
2-1) for문을 한 줄로 표현
# for문
nums = set()
for x in range(1, 11):
nums.add(x)
# set comprehension
nums = {x for x in range(1, 11)}
print(nums)
- set자료형에 요소를 추가할 때는 add함수를 사용한다.
# nums 출력값
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
출력 값은 중괄호 { }로 묶인다.
3. dictionary comprehension
comprehension 표현식을 사용할 때 중괄호 { }로 묶고 출력 값 표시 형식은 key:value 형태로 출력한다. { key : value for key요소, value요소 in 요소를 꺼내올 데이터 ]
3-1) for문을 한 줄로 표현
예시 1 인덱스를 key값으로 한 딕셔너리를 생성
# for문
nums = {}
for x, y in enumerate(range(100, 110, 2)):
nums[x] = y
# dict comprehension
nums = {x:y for x,y in enumerate(range(100, 110, 2))}
- enumerate 함수를 이용해서 인덱스 숫자를 key로 지정했다. 밸류에 해당하는 y는 100~109 사이의 짝수이다.
# nums 출력값
{0: 100, 1: 102, 2: 104, 3: 106, 4: 108}
예시 2 두 개의 리스트 자료형의 각 요소를 짝지어 딕셔너리를 생성
key_num = range(10, 51, 10)
value_num = range(100, 105)
nums2 = {}
for x, y in zip(key_num, value_num):
nums2[x] = y
nums2 = {x:y for x, y in zip(key_num, value_num)}
- zip함수로 요소 개수가 동일한 두 개의 리스트의 각 요소를 슬라이스 하여 key - value를 출력하였다.
# nums2 출력값
{10: 100, 20: 101, 30: 102, 40: 103, 50: 104}
'파이썬 스킬업 > 파이썬 함수 & 문법' 카테고리의 다른 글
파이썬 enumerate( ) 함수/ iterable 자료형의 요소와 인덱스 숫자를 출력 함수 (Python) (0) | 2020.07.16 |
---|---|
파이썬 f-string 문자열 포맷팅_ 문자열 정렬, 소수점 자릿수 지정 (Python) (1) | 2020.07.11 |
파이썬 set( ) 집합자료형 변환 함수 / 중복요소 제거 (Python) (0) | 2020.07.11 |