python comprehension
정의
조건문 혹은 반복문을 적용한 자료형태를 간단하게 작성하는 방법.
list, dict, set 등의 자료 형태에 적용할 수 있다.
- list comprehension
- dict comprehension
- set comprehension
기원 : 집합 내포 표현법
사람들과 이야기하다보면 이 컴프리헨션이 “근본없는 표현법”이라고 하는 경우들이 있다. 하지만 컴프리헨션은 수학의 “집합 내포 표현법”에서 기원한 근본 넘치는 표현법이라는 사실!
수학에서 집합 내포 표기법은 특정 속성을 만족하는 원소들로 새로운 집합을 정의하는 방법이다. 일반적인 형식은 다음과 같다.
\[({F(x) \mid x \in S \land P(x)})\]$S$ : 기존의 원본 집합 (Source Set)
$x \in S$ : 원본 집합 $S$의 각 원소 $x$
$P(x)$ : 원소 $x$가 만족해야 할 조건
$F(x)$ : 조건을 만족하는 $x$에 적용될 함수 또는 표현식
$\mid$ : ~을 만족하는 또는 콜론 (“:”)으로 읽는다.
위 집합 내포 표현법을 파이썬 문법으로 나타내면 아래와 같다.
1
[F(x) for x in S if P(x)]
자료형에 따른 comprehension 예시
list comprehension
(1) 주어진 문장에서 단어들만을 뽑아 리스트로 만들고,
(2) 이 리스트에서 금지단어로 지정된 단어를 빼는 작업을 해보자
먼저, comprehension 사용시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
text = 'stop words는 금지 단어 리스트를 의미합니다.'
stop_words = ['금지', '단어', '리스트']
# (1) 반복문 활용
# text에 포함된 단어를 원소로 가지는 리스트 만들기
text_list = [x for x in text.split()]
"==> 출력 : ['stop', 'words는', '금지', '단어', '리스트를', '의미합니다.']"
# (2) 반복문과 조건문 함께 활용
# stop words에 포함되지 않는 단어로 리스트 만들기
clean_words = [x for x in text_list if x not in stop_words]
"==> 출력 : ['stop', 'words는', '리스트를', '의미합니다.']"
comprehension 미사용시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
text = 'stop words는 금지 단어 리스트를 의미합니다.'
stop_words = ['금지', '단어', '리스트']
# (1) 반복문 활용
# text에 포함된 단어를 원소로 가지는 리스트 만들기
text_list = []
for x in text.split():
text_list.append(x)
"==> 출력 : ['stop', 'words는', '금지', '단어', '리스트를', '의미합니다.']"
# (2) 반복문과 조건문 함께 활용
# stop words에 포함되지 않는 단어로 리스트 만들기
clean_words = []
for x in text_list:
if x not in stop_words:
clean_words.append(x)
else:
continue
"==> 출력 : ['stop', 'words는', '리스트를', '의미합니다.']"
훨씬 짧은 문장으로 같은 기능을 수행할 수가 있다.
이중 for문 comprehension
1
2
3
4
5
ls = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
result = [x for inner in ls for x in inner]
print(result)
>> [1, 2, 3, 4, 5, 6, 7, 8, 9]
dict comprehension
딕셔너리는 키값과 밸류값이 짝을 이루는 자료 형태로,
넓은 활용도를 가진 자료형이다.
처음엔 list comprehension만 있는 줄 알고 쓰다가..
dict comprehension을 만나고는 정말 편해졌다.
주어진 텍스트에 포함된 각 단어에 index를 매긴 dict를 만들어보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
text = 'stop words는 금지 단어 리스트를 의미합니다.'
stop_words = ['금지', '단어', '리스트']
text_list = [x for x in text.split()]
# (1) 반복문 활용
# text에 포함된 단어들을 index를 매겨 dict 형태로 만들기
text_dict = {text_list.index(value) : value for value in text_list}
"==> 출력 : {0: 'stop', 1: 'words는', 2: '금지', 3: '단어', 4: '리스트를', 5: '의미합니다.'}"
# (2) 반복문과 조건문 함께 활용
# stop_words에 포함되지 않은 단어를 index매겨 dict형태로 만들기
clean_dict = {text_list.index(value) : value for value in text_list if value not in stop_words}
"==> 출력 : {0: 'stop', 1: 'words는', 4: '리스트를', 5: '의미합니다.'}"
# enumerate와 함께 사용할 수도 있다.
clean_dict = {i : j for i, j in enumerate([x for x in text_list if x not in stop_words])}
"==> 출력 : {0: 'stop', 1: 'words는', 2: '리스트를', 3: '의미합니다.'}"
set comprehension
나는 set 자료형을 unique 값을 얻어내는 데에 가장 많이 사용하는 것 같다.
더 다양한 활용법을 다룰 수 있는 실력자로 커가길 희망하며..
이번엔 단어가 반복하여 등장하는 텍스트를 대상으로 해본다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
text = '간장 공장 공장장은 강 공장장이고 된장 공장 공장장은 장 공장장이다'
stop_words = ['공장장은', '공장장이고', '공장장이다']
text_list = [x for x in text.split()]
# (1) 반복문 활용
# text에 포함된 단어들을 set에 담아 표현
text_set = {x for x in text_list}
"==> 출력 : {'간장', '강', '공장', '공장장은', '공장장이다', '된장', '장'}"
# (2) 반복문과 조건문 함께 활용
# stop_words에 포함되지 않는 단어를 set에 답아 표현
clean_set = {x for x in text_list if x not in stop_words}
"==> 출력 : {'간장', '강', '공장', '된장', '장'}"
레퍼런스
http://pythonstudy.xyz/python/article/22-Python-Comprehension
https://doorbw.tistory.com/174
방송통신대 - 오픈소스기반 데이터분석(정재화)
Comments