본문 바로가기

Computer Science

[Computer Science] 컴프리헨션(comprehension)

Comprehension
실제 프로그래밍에서 한 줄로 파이썬 기능을 구현할 수 있는 기능이다.
장점: 코드 간소화를 위해 사용, 직관적이며 빠른 속도
단점: 조건이 복잡해 지는 경우 직관성 떨어지고, 메모리 사용량이 증가 하여 사용 어려움

리스트 컴프리헨션

예제 1

리스트속의 숫자를 제곱한 값을 리스트로 도출시키기

'''일반 for문 '''
numbers = [1, 2, 3, 4]
squares = []

for n in numbers:
  squares.append(n**2)

print(squares) 

''' Comprehension 사용 ''' 

numbers = [1, 2, 3, 4]
squares = [n**2 for n in numbers] #리스트 안에 for문을 축약해 작성함. 

print(squares)
[1, 4, 9, 16]

 

예제 2

두개의 1차 행렬 리스트사이에 중첩되는 숫자만 표시만 리스트로 도출하기

list_a = [1, 2, 3, 4]
list_b = [2, 3, 4, 5]

'''일반 for 중첩문'''
common_num = []

for a in list_a:
  for b in list_b:
    if a == b:
      common_num.append(a)
      
print(common_num)

'''Comprehension으로 만든 for 중첩문'''

common_num = [a for a in list_a for b in list_b if a==b]

print(common_num)
[2, 3, 4]

딕셔너리 컴프리헨션

예제 3

딕셔너리 컴프리헨션의 기본 예

test딕셔너리의 각 아이템을 선언한후  key값(na)이 E와 같지 않으면 출력하라.

# 딕셔너리 컴프리헨션

test = {'A': 5, 'B': 7, 'C': 9, 'D': 6, 'E': 10} 

test = {na:test for na,test in test.items() if na != 'E'}
print(test)
{'A': 5, 'B': 7, 'C': 9, 'D': 6}

 

예제 4

딕셔너리의 value값을 조건에 맞춰서 변경하여 저장

''' 아래와 같이 조건을 반복문 대신 조건을 먼저 쓸 수 있다.
조건을 위해 if를 사용하는 경우 else를 작성해줘야된다.'''

numberss = {'A': 5, 'B': 7, 'C': 9, 'D': 6, 'E': 10} 

pas = {name: 'PASS' if numbers > 8 else 'NO PASS' for name, numbers in numberss.items()}
# nameL'Pass로 표시해라 만약 value값이 8보다 크면 else일경우 'NO PASS'로 표시,key값은 name 이고 value는 numbers이다
print(pas)
{'A': 'NO PASS', 'B': 'NO PASS', 'C': 'PASS', 'D': 'NO PASS', 'E': 'PASS'}

 

리스트와 딕셔너리 혼합 컴프리헨션

예제 5

1부터 6전까지의 숫자를 6전까지의 수만큼 나열하는 반복문의 차이

[] 는 반복 리스트

{} 는 set 로 중복값을 제외

''' 아래처럼 반복문을 연속으로 작성가능하다.
set은 특성상 중복값을 제외한다.'''

print('list for loop : ',[n for n in range(1, 5+1) for n in range(1, 5+1)])

print('set for loop : ',{n for n in range(1, 5+1) for n in range(1, 5+1)})
list for loop :  [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
set for loop :  {1, 2, 3, 4, 5}

 

예제 6

zip모듈을 사용해서 두개의 리스트를 하나의 딕셔너리로 합치기

'''두개의 리스트를 하나의 딕셔너리로 합침. 
하나는 key, 또 다른 하나는 value로 사용한다'''

subjects = ['math', 'history', 'english', 'computer engineering']
scores = [90, 80, 95, 100]
score_dict = {key: value for key, value in zip(subjects, scores)}
print(score_dict)
{'math': 90, 'history': 80, 'english': 95, 'computer engineering': 100}

 

예제 7

리스트 속에 있는 튜플을 딕셔너리 형태로 추출

# 튜플 리스트를 딕셔너리 형태로 변환
score_tuples = [('math', 90), ('history', 80), ('english', 95), ('computer engineering', 100)]
score_dict = {t[0]: t[1] for t in score_tuples}
print(score_dict)

 

{'math': 90, 'history': 80, 'english': 95, 'computer engineering': 100}

 

 

PLUS...

행렬의 리스트 컴프리헨션의 이해

https://whatisthenext.tistory.com/110

 

[파이썬] 리스트 컴프리헨션(list comprehension)의 이해

0. 들어가기 앞서 행(row)을 만나기 위해서는 matrix의 괄호를 한 번 벗겨야 한다. 행의 원소(element)들을 만나기 위해서는 matrix의 괄호를 두 번 벗겨야 한다. 한 번 벗기기 위해서는 for문을 한 번만

whatisthenext.tistory.com