컴프리헨션
- 하나 이상의 순회(리스트, 시퀀스, generator종류들) 가능한 객체로부터 파이썬의 자료구조(리스트, 딕셔너리, 셋, 제너레이터)를 간단하게 만드는 방법
- 파이썬을 더욱 파이썬(?)(pythonic) 스럽게 사용하는 방법
- 파이썬의 리스트가 특이한 점은 리스트 안에 for 반복문과 if 조건문을 사용할 수 있다는 점.
- 리스트 안에 식, for 반복문, if 조건문 등을 지정하여 리스트를 생성하는 것을 리스트 컴프리헨션(list comprehension)이라고 한다.
(pythonic : 간결하고 가독성 좋게 코드를 작성하는 방법? 뭐 그렇게 생각하자)
리스트 컴프리헨션
1~10 까지의 정수를 저장하는 리스트를 만드는 방법은?
- 방법1
numbers = [1,2,3,4,5,6,7,8,9,10]
- 방법2
numbers = []
numbers.append(1)
numbers.append(2)
...
numbers.append(10)
- 방법3
numbers []
for n in range(1,11):
numbers.append(n)
- 방법4
numbers = list(range(1,11))
만약, 1~100000까지의 수를 저장하는 리스트를 만드는 방법을 선택하고자 한다면?
- 현재까지는 방법4가 합리적임
- 더 간단하게 표현할 방법은? -> 리스트 컴프리헨션
리스트 컴프리헨션을 사용한 방법
- 리스트 컴프리헨션의 형식
[ <표현식> for <항목> in <순회 가능한 객체> ]
- 1~10까지의 정수를 리스트 컴프리헨션을 사용하여 생성
numbers = [ x for x in range(1,11) ]
- 앞의 방법 4)가 더 간단해 보이지만, 리스트 컴프리헨션을 사용하면 더 다양한 형태의 리스트를 생성할 수 있음
- 예) 1~10까지의 정수 각각을 문자열로 변환하여 리스트 생성
str_numbers = [str(x) for x in range(1, 11)]
- 리스트 컴프리헨션 안에서 조건 표현식을 추가할 수도 있음
[ <표현식> for <항목> in <순회 가능한 객체> if <조건> ]
EX)
>>> even_number = [x for x in range(1,11) if x % 2 == 0]
>>> print(even_number)
[2, 4, 6, 8, 10]
- 이중 for in 구문을 이용한 리스트 컴프리헨션
matrix = [(row, col0 for row in [1,2,3] for col in [1,2]]
딕셔너리 컴프리헨션
딕셔너리도 컴프리헨션으로 생성이 가능
{<키 표현식>:<값 표현식> for <항목> in <순회 가능한 객체>}
ex
>>> s = 'python programming is very easy'
>>> counts = {letter: s.count(letter) for letter in s}
>>> counts
{'p': 2, 'y': 3, 't': 1, 'h': 1, 'o': 2, 'n': 2, ' ': 4, 'r': 3, 'g': 2, 'a': 2, 'm': 2, 'i': 2, 's': 2, 'v': 1, 'e': 2}
문제) 위 코드는 중복된 문자에 대해 중복된 만큼 수행을한다. 중복이 되지 않게 수행되도록 바꾸어보자
>>> s1 = set(counts)
>>> s1
{'y', 'h', 'a', 'v', 'm', 'n', 'p', 'o', 'g', 't', 's', ' ', 'e', 'i', 'r'}
셋 컴프리헨션
셋 컴프리헨션의 형식
{ <표현식> for <항목> in <순회 가능한 객체> }
제너레이터 컴프리헨션
- () 로 감싸서 컴프리헨션을 표현하면 튜플이 될 것 같지만, 튜플은 컴프리헨션 없음
- () 로 감싸서 컴프리헨션을 표현하면 이는 제너레이터 컴프리헨션이 됨 (제너레티어 객체가 생성)
- 제너레티어에 대한 자세한 내용은 함수의 제너레이터에서 설명할 것임
- 제너레이터 컴프리헨션과 리스트 컴프리헨션의 비교
>>> lc = [x for x in range(10)]
>>> gc = (x for x in range(10))
>>> lc
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> gc
<generator object <genexpr> at 0x000001A4F1610890>
>>> list(gc)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(gc)
제너레이터는 숫자를 한번 만들어 냈으면 그 다음부턴 만들어 내지 않는다.
Problems
- 1~100 사이의 정수를 ',' 로 join 하여라.(Hint. 먼저 리스트 컴프리헨션을 사용하여 숫자를 문자열 타입으로 변환해야 하여 join을 해야 한다. )
>>> str_numbers = ', '.join([str(x) for x in range(1,100)])
>>> str_numbers
'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, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99'
- 사용자가 텍스트를 입력했을 때, 각 단어가 몇 번 나타났는지 카운트 하는 프로그램을 작성하라
- 텍스트 입력은 인터넷에서 텍스트를 복사하여 사용
- Hint. 단어는 split() 함수를 이용하여 분리
- 딕셔너리 컴프리헨션을 사용하여 단어 별로 카운팅을 수행
text = input("텍스트 입력 ")
words = text.split()
counts = {word: words.count(word) for word in set(words)}
for k, v in counts.items():
print(k, v)
출력
텍스트 입력 Life is good
good 1
is 1
Life 1
요약
- 컴프리헨션은 순회 가능한 객체로부터 파이썬의 자료구조를 만드는 방법이며, 파이썬을 더 파이썬스럽게 사용하도록 하는 방법이다.
- 컴프리헨션은 리스트 컴프리헨션, 딕셔너리 컴프리헨션, 셋 컴프리헨션, 제너레이터 컴프리헨션이 있다.
'Language > Python' 카테고리의 다른 글
[Python] Ch6 - part1. 모듈 (0) | 2021.04.24 |
---|---|
[Python] Ch5 - 함수 (0) | 2021.04.24 |
[Python] Ch4 - part 2. 반복문 (0) | 2021.03.29 |
[Python] Ch4 - part 1. 조건문 (0) | 2021.03.28 |
[Python] Ch3 - part 3. 셋 (0) | 2021.03.27 |