티스토리 뷰

 

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 자료형 특성에 대한 설명 바로가기 ]

 

파이썬 set( ) 집합자료형 변환 / 중복요소를 제거하고 중복되지 않는 원소(unique한 값) �

set( ) 집합 자료형으로 변환하는 함수. 중복을 허용하지 않는 특성을 이용하여 unique한 값을 남기고 중복을 제거 할 때 사용한다. 순서가 없고 리턴 되는 값은 { } 중괄호로 묶인다. [순서] 집합 자�

ooyoung.tistory.com

 

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}

 

반응형
댓글
반응형