Python Comprehension

minch·2021년 6월 17일
0

Python

목록 보기
8/13
post-thumbnail

Python Comprehension

반복 가능(iterable)한 객체(list, dict, set 등)를 생성할 때, 기존 여러 줄의 코드를 작성하는 방식에서 Python에서는 훨씬 간단한 코드로 효율적인 객체를 생성할 수 있다.
예를 들어, 1 ~ 10까지의 제곱을 갖는 list를 생성할 때

일반적인 iterable한 객체

List = []
for i in range(1,11):
    List.append(i**2) 
print(List)

Comprehension

List = [i**2 for i in range(1,11)]
print(List)

위를 보면 기존 4줄의 코드에서 1줄로 줄어든 것을 볼 수 있다. 그리고 작업 시간 또한 훨씬 짧아진다.
이러한 방식을 Comprehension이라 하고 크게 아래 4가지 종류가 존재한다.

  • List Comprehension
  • Set Comprehension
  • Dict Comprehension

List Comprehension

list를 생성하는 방법으로 [] 안에 for, if 등의 조건문을 추가하여 사용할 수 있다.

길이가 5글자인 단어만 List로 만들기 :

words = ['alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot', 'golf', 'hotel', 'india']
List = [i for i in words if len(i) == 5]
print(List)

결과

['alpha', 'bravo', 'delta', 'hotel', 'india']

위처럼 리스트 안에 직접 조건식을 추가해주어 생성하는 것이다.

실제로 for loop & Comprehension 의 작동시간을 비교해보면,

import timeit

words = ['alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot', 'golf', 'hotel', 'india']

def for_loop():
    list_for = []
    for i in words:
        if len(i) == 5:
            list_for.append(i)

def list_comprehension():
    list_com = [i for i in words if len(i) == 5]

if __name__ == "__main__":
    time1 = timeit.Timer("for_loop()", "from __main__ import for_loop")
    print("for_loop() time = ", time1.timeit(number=1000), "milliseconds")

    time2 = timeit.Timer("list_comprehension()", "from __main__ import list_comprehension")
    print("list_comprehension time = ", time2.timeit(number=1000), "milliseconds")

결과

for_loop() time =  0.0024152719999999683 milliseconds
list_comprehension time =  0.0010693420000000287 milliseconds

위와 같이 Comprehension을 사용한 것이 더 빠른 것을 알 수 있다!

Set Comprehension

List Comprehension과 형태와 방법은 거의 동일하지만 집합(set) {} 을 생성한다는 차이점만 존재한다.

Dict Comprehension

마찬가지로 dict 를 생성하는 방법으로 keyvalue 값을 직접 지정해주면 생성 가능하다.

시험과목에 대한 점수 dict 만들기 :

subjects = ['korean', 'math', 'english', 'science']
scores = [90, 80, 95, 100]
My_scores = {key: value for key, value in zip(subjects, scores)}
print(My_scores)

결과

{'korean': 90, 'math': 80, 'english': 95, 'science': 100}

zip(x,y) 형태로 key & value의 객체를 지정해줌

zip(x,y)?

아래는 tuple 형태의 객체에서 불러올때,

score_tuples = [('korean', 90), ('math', 80), ('english', 95), ('science', 100)]
My_scores = {t[0]: t[1] for t in score_tuples}
print(My_scores)

결과

{'korean': 90, 'math': 80, 'english': 95, 'science': 100}

이 경우에는 Comprehension 말고 dict() 함수를 쓰면 간단히 표현 가능하다.
(하지만 Comprehension의 속도가 더 빠르다!)

My_scores = dict(score_tuples)
print(My_scores)

참조
(https://mingrammer.com/introduce-comprehension-of-python/)
(https://dojang.io/mod/page/view.php?id=2285)

0개의 댓글