python comprehension 이란?
조건문 혹은 반복문을 적용한 자료형태를 간단하게 작성하는 방법.
list, dict, set 등의 자료 형태에 적용할 수 있다.
- list comprehension
- dict comprehension
- set comprehension
자료형에 따른 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