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