본문 바로가기
programming/Python

파이썬 컴프리헨션 기존의 목록을 재가공하여 새 목록을 만듬 Python Comprehension

by 개코 - 개발과 코딩 2021. 8. 16.

파이썬 컴프리헨션은 복잡한 코드를 단순화하여 기존의 목록을 새로운 목록으로 만드는 독특한 동작을 한다. C#의 Linq 또는 Lambda 식과 같은 느낌이 든다. 다만 차이가 있다면 기존의 목록이 새로운 목록으로 바뀐다는 점이 차이가 있다. 이것은 내부 동작이기 때문에 그렇다고 넘어가자.

파이썬 리스트 컴프리헨션 리스트 재구성
파이썬 리스트 컴프리헨션 리스트 재구성

파이썬 컴프리헨션
Python Comprehension

파이썬 컴프리헨션은 목록의 내용을 재구성한다.

코드는 단순하다.

코드를 보면 알 수 있는데, 파이썬 컴프리헨션 동작이 발생하면 내부적으로 반복을 실행하여 조건에 맞는 목록으로 변경한다.

문법은 아래와 같다.

list = [expression for item in iterable if condition == True]

위의 구문을 해석하면 반복되는 리스트에서 상태가 참인 아이템을 표시한다.

위의 구문에서 조건문은 생략할 수 있다.

여러가지 예제를 보면서 살펴보기로 한다.

 

샘플 데이터 준비

목록은 데이터가 적당히 있는 것으로 선택하고 진행한다.

해당 목록 데이터를 이용해 여러가지 파이썬 컴프리헨션을 다뤄본다.

 

vList = ["JYP", "트와이스", "twice", "나연", "정연", "모모", "사나", "지효", "미나", "다현", "채영", "쯔위"]

print("목록 : ", type(vList), len(vList), vList)

 

조건문의 생략

파이썬 컴프리헨션에서 조건문은 생략할 수 있다.

생략하면 목록의 값은 변함이 없다.

기존 그대로의 데이터를 가지고 있을 뿐이다.

vList = [lpEach for lpEach in vList]

print("목록 : ", type(vList), len(vList), vList)

목록을 재구성한다.

기존의 목록 내용을 반복하여 리스트에 값을 넣고 변수는 그대로 사용한다.

출력을 했을 때 값은 변함이 없이 전체 리스트 데이터가 들어있는 것을 확인할 수 있다.

 

조건문 사용

조건문을 사용하여 목록을 구성해 본다.

여기서부터 차이가 있음을 알 수 있다.

전통적인 조건문은 if 키워드를 사용하겠지만 파이썬 컴프리헨션에서 조건은 문법의 마지막에 작성하면 된다.

특별한 경우 파이썬 컴프리헨션의 문법 앞에 넣을 수도 있다.

vList = [lpEach for lpEach in vList if "쯔" in lpEach]

print("목록 : ", type(vList), len(vList), vList)

목록에서 쯔라는 단어가 있는 값을 출력하도록 한다.

결과 화면을 보면 쯔 단어가 들어간 것은 쯔위이며 쯔위만 들어간 리스트로 재구성된 것을 알 수 있다.

위의 코드를 전통적인 방법으로 변경하면 아래와 같다.

for lpEach in vList:
      if "쯔" in lpEach:
          vList.clear()
          vList.append(lpEach)

print("목록 : ", type(vList), len(vList), vList)

위의 결과화면와 같다.

여기서 알 수 있는 것은 리스트를 구성하는 코드가 가시적으로 많이 축약된 것을 알 수 있다.

조건문을 뒤에 작성하면 각 값들을 비교하여 리스트에 값을 설정하겠지만, 설정한 값을 조작할 수 있다

이 때는 조건을 앞에 작성하여 표현할 수 있다.

vList = [lpEach if lpEach != "트와이스" else "twice" for lpEach in vList]

print("목록 : ", type(vList), len(vList), vList)

반복을 하면서 모든 값을 표현하며, 표현되는 값 중 트와이스 란 단어를 twice 로 변경하는 의미이다.

조건문이 전방 또는 후방에 위치했을 때의 동작을 알아두도록 하자.

가시적은 출력은 동일할 수 있다.

다만 실행순서 따라 조건문이 전방에 위치했는가? 후방에 위치했는가? 에 따라 결과값이 달라질 수 있다.

상황에 맞게 사용하면 된다.

 

값을 치환하기

만약, 모든 값이 민감한 데이터이며, 표시는 하되 비밀번호와 같은 * 표로써 치환할 필요가 있다.

파이썬 컴프리헨션의 표현 expression 부분을 변경해 주면 된다.

vList = ['*****' for lpEach in vList]

print("목록 : ", type(vList), len(vList), vList)

모든 값이 * 표로 치환된 것을 알 수 있다.

내용을 표시는 해야 겠지만, 가시적인 값을 숨기거나 또는 다른 값으로 표현할 때 사용하면 된다.

반응형

댓글