[파이썬] 컴프리헨션(Comprehension)

컴프리헨션(Comprehension)

  • 수학의 집합에서 특정 수식을 사용하는 방식처럼 파이썬에서 간단한 표현식을 작성하는 기법
  • 리터럴 표기법으로 원소를 나열하여 객체 생성 시 원소가 많으면 모두 나열하기 어려우므로 간단한 표현식으로 작성

 

I. 리스트 컴프리헨션

  • 리스트 객체 생성 시 원소 나열 방식으로 리터럴 표기법 사용
  • 객체의 원소가 많은 경우 대괄호 안에 표현식을 작성하여 원소를 나열
  • [예제] map함수에 대한 리스트 컴프리헨션
list1 = [1,2,3,4,5]
m = map(lambda x : x * x, list1)
print(m)        # 클래스를 객체로 만들어서 반환
print([*m])     # map 객체에 별표를 붙이면 원소를 변환하여 리스트 내 표시

### 위 클래스로 작성한 것을 아래 컴프리헨션으로 간단히 작성 ###

ch = [x * x for x in list1] # 원소를 하나씩 처리하기 위해 인라인으로 for 문 사용
print(ch)

[결과]
<map object at 0x02FE1FD0>
[1, 4, 9, 16, 25]
[1, 4, 9, 16, 25]

 

II. 딕셔너리와 집합 컴프리헨션

  • 딕셔너리(dict)와 집합(set)도 리스트 컴프리헨션과 유사한 표기법 사용
  • 딕셔너리와 집합은 중괄호를 사용하여 원소가 하나인지 쌍인지 구별
  • [예제] 딕셔너리와 집합 컴프리헨션
set1 = {1,2,3,4,5}
m = map(lambda x : x * x, set1) # 집합을 map에 넣어 처리 가능
print({*m})

list1 = [('a', 1), ('b', 2)]

def func1(x) :          # 함수 생성
    x = list(x)         # 인자로 전달된 튜플을 리스트로 변환
    x[1] = x[1] * x[1]  # 첫 번째 원소를 곱 연산하여 첫 번째 원소에 할당
    x = tuple(x)        # 다시 튜플로 변환
    return x

m2 = map(lambda x : func1(x), list1)    # 리스트 전달 시 함수의 변환을 람다 함수로 표시 시 정의된 함수를 표현식에 넣어 실행
print([*m2])
print({x : y * y for x, y in list1})    # 딕셔너리 컴프리헨션으로 두 값을 곱 연산하도록 별도 함수 없이 처리

[결과]
{1, 4, 9, 16, 25}
[('a', 1), ('b', 4)]
{'a': 1, 'b': 4}

 

III. 컴프리헨션 처리 시 고려사항

가. 컴프리헨션 지역변수 외부 사용 불가

  • 컴프리헨션은 함수처럼 지역 이름공간을 사용하므로 컴프리헨션에 정의된 변수는 외부 사용 불가
  • [예제] 컴프리헨션 지역변수 외부 사용
list1 = [x for x in range(10)]  # 리스트 컴프리헨션 사용 변수는 지역 이름공간으로 처리
print(list1)
print(x)        # 리스트 컴프리헨션 사용 변수 확인(에러 발생)

[결과]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Traceback (most recent call last):
  File "c:\python.py", line 3, in <module>
    print(x)
NameError: name 'x' is not defined

나. 동적 반복자는 내부 원소 처리

  • 반복자 클래스로 객체 생성 후 그 객체로 내부 원소 처리해야 함

 
[참고]

  • 잇플, “한 권으로 개발자가 원하던 파이썬 심화 A to Z”, 2019.11

콘텐츠 사용 시 출처 표기 부탁 드리고, 궁금한 점이나 의견은 댓글 남겨주세요^^