Python 강좌 : 제 19강 - 간소화

Python Comprehension

Python 강좌 : 제 19강 - 간소화
[ Python ] - 윤대희

간소화(Comprehension)


간소화(Comprehension)반복 가능한 객체(iterable)들을 축약한 형태으로 생성하는 방법입니다.

대표적으로 리스트(List), 튜플(Tuple), 집합(Set) 사전(Dict), 생성자(Generator) 등이 있습니다.

즉, ListTuple 등을 한 줄로 생성하여 간소화할 수 있습니다.

반복 가능한 객체들을 간소화하게 되면 코드 구성이 깔끔해져 더 읽기 쉬운 코드를 구성할 수 있습니다.

또한, 조건문 등을 추가하여 코드를 간략화 할 수 있습니다.



List Comprehension


L = [i ** 2 for i in range(10)]

print(L)
결과
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


[리스트 값 for 변수 in 범위]를 이용하여 범위만큼 반복하여 변수를 할당해 리스트에 리스트 값을 채웁니다.

range(10)0~9의 값을 지니고 있으며 i에서 각각의 값들을 호출합니다.

for문을 통해 반복하게 되어 리스트 값을 조건에 맞게 채우게됩니다.



Comprehension + if


L1 = [i ** 2 for i in range(10) if (i > 5)]

print(L1)

L2 = [i ** 2 for i in range(10) if (i > 5) and (i % 2 == 0)]

print(L2)

L3 = [i ** 2 if i < 5 else i for i in range(10)]

print(L3)
결과
[36, 49, 64, 81]
[36, 64]
[0, 1, 4, 9, 16, 5, 6, 7, 8, 9]


[리스트 값 for 변수 in 범위 if (조건)]을 이용하여 if (조건)을 추가해 조건식에 맞는 경우의 리스트를 생성할 수 있습니다.

if (i > 5)6 ~ 9의 값을 지니고 있으며 i에서 각각의 값을 호출할 때 5부터 값을 호출합니다.

조건에는 andor 등을 포함하여 조건식을 추가할 수 있습니다.

또한, 간소화 구문에는 삼항 연산자(Ternary operators)를 적용할 수 있습니다.

참 값 if 조건 else 거짓 값의 형태로 값이 반환되므로, 리스트 값 영역에 참 값 또는 거짓 값을 할당할 수 있습니다.



Multiple Comprehension


L = [['a', 'b', 'c'], ['d', 'e', 'f']]

flatten = [j for i in L for j in i]

print(flatten)

extend = [[j + j for j in i] for i in L]

print(extend)
결과
[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’]
[[‘aa’, ‘bb’, ‘cc’], [‘dd’, ‘ee’, ‘ff’]]

간소화 구문은 여러 번 사용하여 반복할 수 있습니다.

L은 2차원 리스트로 구성되어 있어 1차원 리스트로 변환한다면 두 번의 반복문의 구성을 필요로 합니다.

여기서, 간소화 구문을 두 번 반복하여 1차원 리스트로 간단하게 변경할 수 있습니다.

기본적인 간소화 구문은 [i for i in L]의 형태를 갖습니다.

하지만, 이 구문은 [‘a’, ‘b’, ‘c’][‘d’, ‘e’, ‘f’]를 반복하므로 한 번 더 반복해야 합니다.

그러므로 i에 대한 반복문을 추가로 구성합니다.

[j for j in i]의 구성이 필요합니다. 여기서, 앞 부분이 아닌 뒷 부분에 연결합니다.

그러므로, [i for i in L]에서 반환 해줄 리스트 값은 j가 되므로 [j for i in L]로 먼저 변경합니다.

이후에, L 뒷 부분에 for j in i를 이어 붙여 [j for i in L for j in i] 형태로 구성합니다.

만약, 3차원 리스트를 평평하게 만든다면 위와 같은 방식으로 맨 앞의 j 대신에 k로 변겯한 다음, for k in j를 그대로 이어 붙이면 됩니다.

즉, [k for i in L for j in i for k in j]과 같은 구성이 됩니다.


다음으로는, 뒷 부분에 이어붙이는 방법이 아닌 앞 부분에 이어 붙이는 방법입니다,

이 방법은 차원을 그대로 유지한 상태로 값을 변경할 수 있습니다.

리스트에 채워질 i에 대해서 다시 간소화 구문을 반복하는 방법입니다.



Tuple Comprehension


data = [0, 7, 6, 9, 2, 3]

T = tuple((i for i in data))

print(T)
결과
(0, 7, 6, 9, 2, 3)

Tuple은 다른 간소화와 다르게, 명시적으로 tuple()로 변경해야 합니다.

소괄호를 사용한 간소화는 생성자 표현(Generator Expression)입니다.

생성자는 반복 가능한(iterable) 형식으로 반환할 수 있습니다.

그러므로, 생성자(Generator)를 tuple()로 변경해 사용합니다.



Set Comprehension


text = "YUNDAEHEE"

S1 = set([i for i in text])

print(S1)

S2 = {i for i in text}

print(S2)
결과
{‘E’, ‘Y’, ‘N’, ‘D’, ‘A’, ‘H’, ‘U’}
{‘E’, ‘Y’, ‘N’, ‘D’, ‘A’, ‘H’, ‘U’}

간소화을 이용할 때, 범위문자열로 사용하여 문자 값을 직접 할당할 수 있습니다.

또한 Set의 연산이 필요할 때, Set Comprehension를 이용한다면 S1에서 사용된 List → Set 구간을 줄여 전체적인 연산량을 감소시킬 수 있습니다.



Dictionary Comprehension


text = "cheese"

D = {i : text.count(i) for i in text}

print(D)
결과
{‘c’: 1, ‘h’: 1, ‘e’: 3, ‘s’: 1}


List 이외에도 Dictionary Comprehension를 이용하여 사전을 간소화할 수 있습니다.

{key : value for 변수 in 범위}를 이용하여 범위만큼 반복하여 변수를 할당해 key값과 value값을 채웁니다.

key에는 문자가 담겨있으며 value에는 문자의 개수가 담겨있습니다.



Book Image

개정판이 출간됐습니다!

C#과 파이썬을 활용한 OpenCV 4 프로그래밍 (개정판)

컴퓨터 비전 기초 이론부터 머신러닝을 활용한 영상 처리 프로젝트까지

  • C#과 파이썬용 OpenCV의 데이터 형식과 행렬 및 배열 연산
  • 이미지/동영상/카메라를 활용한 입출력과 결과 저장
  • 전처리 과정과 정보를 탐색하기 위한 이미지 변형
  • 유의미한 정보를 검출하기 위한 이미지 변환
  • 이미지에서 정보를 검출 및 인식
  • 객체 검출을 포함한 모션 추적
  • K-means, KNN, SVM 등의 머신러닝 알고리즘 적용 방법
  • 카페(Caffe), 다크넷(Darknet), 텐서플로 모델을 활용한 딥러닝 모듈 적용 방법
  • Tesseract-OCR과 C# OpenCvSharp4를 활용한 프로젝트
  • 텐서플로와 Python OpenCV4를 활용한 프로젝트
  • 윤대희 저 | 위키북스

    [yes24 바로가기] [알라딘 바로가기] [교보문고 바로가기]

    후원하기


    ⤧  Previous post Python 강좌 : 제 18강 - 예외 형식 ⤧  Next post Python 강좌 : 제 20강 - 사용자 정의 함수
    Python Category