[Python] List Comprehension

DEINGVELOP·2022년 8월 27일

List Comprehension

: 쉽고 간결하게 List를 만들 수 있는 Python의 문법

  • Python의 List : Java 등 타 언어의 배열과 매칭되는 선형 자료구조



📌 유형 1 - 표현식 + for문

result에 새로운 리스트가 저장되는 과정은 위의 그림과 같다.

즉, 표현식과 for 반복문을 통해 리스트를 한 줄로 정의할 수 있는 것이다.

👉🏻 활용 예시

  • n개의 0으로 리스트 초기화하기
    new_list = [ 0 for i in range(5) ]		# => [0, 0, 0, 0, 0]

  • 0부터 n-1까지 순차적인 숫자로 리스트 초기화하기
    new_list = [ i for i in range(5) ]		# => [0, 1, 2, 3, 4]

  • 다른 리스트의 값을 그대로 복사하기
    list1 = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
     new_list = [ n for n in list1 ]		# => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

👉🏻 활용 예시 2 : 표현식에 연산식/함수를 쓰는 경우

  • 다른 리스트의 제곱값을 구하는 리스트 생성하기

    list1 = [0, 1, 2, 3, 4]
     new_list = [ n*n for n in list1 ]		# => [0, 1, 4, 9, 16]

  • 문자열 리스트의 각 문자열 길이를 저장하는 리스트 생성하기

    str_list = [ "List", "Comprehension", "python"]  
     new_list = [ len(string) for string in str_array]		# => [4, 13, 6]

  • 5로 나눈 나머지를 저장하는 리스트 생성하기

    list1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    # 5로 나눈 나머지를 return하는 함수 생성
    def mod_5 (number) :
        return number % 5
        
    # 표현식에 함수 활용
    result = [mod_5(n) for n in list1]   # [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]



📌 유형 2 - 표현식 + for문 + 조건문

유형 1에서 조건문이 하나 더 붙은 유형이다.

👉🏻 활용 예시

  • 범위 내 짝수만 저장하는 리스트 생성
    new_list = [ n for n in range(10) if n%2 == 0 ]		# => [0, 2, 4, 6, 8]

  • 배열에서 양수만 저장하는 리스트
    list1 = [ -1, 0, -4, 24, 5, -10, 2 ]
    new_list = [ n for n in array if n > 0 ]		# => [24, 5, 2]

💡 주의!

이런 표현 방법이 매우 편리하긴 하지만, 조건문을 100% 자유롭게 활용할 수 있는 것은 아니다.

  • 단일 조건문만 사용이 가능하다. 즉, elseelif를 사용할 경우에는 문법 오류가 난다.

  • 그렇지만 if를 여러 번 사용하는 것은 가능하다. 이 경우에는 두 조건문이 and로 묶인 것과 같은 결과가 나온다.

# 예시 : 3의 배수 중 홀수만 저장하는 리스트 생성하기

# 방법 1. if를 두 번 사용
new_list = [ n for n in range(50) if n%3 == 0 if n%2 != 0 ] 		# => [3, 9, 15, 21, 27, 33, 39, 45]

# 방법 2. 두 if 조건문을 and로 연결
new_list = [ n for n in range(50) if n%3 == 0 and n%2 != 0 ] 		# => [3, 9, 15, 21, 27, 33, 39, 45]



📌 유형 3 - 표현식 + 조건문 + for문

👉🏻 활용 예시

  • 양수는 그대로, 음수는 0으로 저장하는 리스트
    list1 = [-1, 10, -4, 0, 24, 5, -10, 2]
    new_list = [n if n>0 else 0 for n in list1]		# => [0, 10, 0, 0, 24, 5, 0, 2]

  • 짝수라면 'even', 홀수라면 'odd'를 저장하는 리스트
    list1 = [0, 1, 2, 3]
    new_list = ['even' if n%2==0 else 'odd' for n in list1]		# => ['even', 'odd', 'even', 'odd']

💡 주의
이 경우에는 ifelse를 사용할 수 있다!



📌 유형 4 - 중첩 for문

중첩된 for문도 list comprehension 안에서 사용할 수 있다.

👉🏻 활용 예시

  • i*j를 원소로 넣는 리스트 생성 (i = 1~3, j = 1~2)
    pos = [ i*j for i in range(1, 4) for j in range(1, 3) ]		# => [1, 2, 2, 4, 3, 6]



📌 유형 5 - 중첩 List Comprehension

다차원 배열도 List Comprehension으로 선언할 수 있다. 대괄호[] 안에 다시 대괄호[]를 넣어 중첩된 List Comprehension을 사용하는 방식이다.

이때, 밖에 있는 for문부터 확인해나간다.

👉🏻 활용 예시

  • 2차원 배열 생성
    result = [ [ 0 for i in range(2) ] for j in range(3) ] 		# => [ [0, 0], [0, 0], [0, 0] ]




참고자료

0개의 댓글