반복 가능(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
를 생성하는 방법으로 []
안에 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을 사용한 것이 더 빠른 것을 알 수 있다!
List Comprehension과 형태와 방법은 거의 동일하지만 집합(set
) {}
을 생성한다는 차이점만 존재한다.
마찬가지로 dict
를 생성하는 방법으로 key
와 value
값을 직접 지정해주면 생성 가능하다.
시험과목에 대한 점수 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)