List Comprehension 문법 정리

MTTW·2021년 4월 29일
13

Python

목록 보기
2/2

List는 대괄호 "[", "]"를 이용하여 선언할 수 있다.

list = [ 0, 1, 2, 3, 4 ]

List Comprehension은 대괄호 사이에 for문, 조건문 등을 사용하여 간결하게 List를 만들 수 있게 해준다.

Python 공식 문서에서는 아래와 같이 정의한다.

코드로 문법을 확인하다보면 Comprehension이 무엇인지 감을 잡기 쉽다.
List Comprehension에서 확인해볼 구조는 크게 다섯 가지로 정리할 수 있을 것 같다.

  1. 기본 구조 : 표현식 + for문
    result = [표현식 for 변수 in 리스트]

  2. 표현식 + for문 + 조건문
    result = [표현식 for 변수 in 리스트 조건문]

  3. 조건문 + for문
    result = [조건문 for 변수 in 리스트]

  4. 중첩 for문
    result = [조건문 for 변수1 in 리스트1 for 변수2 in 리스트2 ...]

  5. 중첩 List Comprehension

기본 구조 : 표현식 + for문

표현식에 변수 또는 상수를 쓰는 경우

n = 5

# n개의 0으로 초기화된 리스트
result = [ 0 for i in range(n) ]   # [0, 0, 0, 0, 0]

# 0 ~ n으로 초기화된 리스트
result = [ i for i in range(n) ]   # [0, 1, 2, 3, 4]

# array 리스트의 값을 그대로 복사
array = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
result = [ n for n in array ]       # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

표현식에 연삭식이나 함수를 쓰는 경우

연산식이나 함수를 사용하여 원하는 값을 만들 수 있다.

# array의 제곱값을 구하는 리스트
result = [ n*n for n in array ]      # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 문자열 리스트의 각 문자열의 길이를 저장하는 리스트
str_array = [ "List", "Comprehension", "python"]  
result = [ len(string) for string in str_array]   # [4, 13, 6]

# 5로 나눈 나머지를 저장하는 리스트 - 함수 사용
def mod_5 (number) :
    return number % 5
    
result = [mod_5(n) for n in array]   # [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

표현식 + for문 + 조건문

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

# 범위 내 홀수만 저장하는 리스트
result = [ n for n in range(10) if n%2 != 0 ]   # [1, 3, 5, 7, 9]

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

조건문이 for문 뒤에 붙는 경우에는 단일 조건문 밖에 못쓴다는 특징이 있다. else나 elif를 사용할 경우 문법 오류가 나타난다.

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

# 3의 배수 중 홀수만 저장하는 리스트
result = [ n for n in range(50) if n%3 == 0 if n%2 != 0 ]   
# [3, 9, 15, 21, 27, 33, 39, 45]
result = [ n for n in range(50) if n%3 == 0 and n%2 != 0 ]  
# [3, 9, 15, 21, 27, 33, 39, 45]

표현식 + 조건문 + for문

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

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

중첩 for문

아래와 같이 중첩된 for문으로 배열을 만드는 경우도 한줄로 나타낼 수 있다. 가장 밖에 나오게되는 for문부터 순서대로 적으면 된다.

# 중첩 for문
pos = []
for i in range(1, 4) :
    for j in range(1, 3) :
        pos.append(i*j)

pos = [ i*i for i in range(1, 4) for j in range(1, 3) ]  # [1, 2, 2, 4, 3, 6]

중첩 List Comprehension

2차원 배열도 List Comprehension으로 선언할 수 있다.
위에 있는 중첩 for문과 비슷한듯 다르다. 대괄호 안에 다시 대괄호를 넣어서 중첩된 Comprehension을 사용하는 방식이다. 이런 경우에는 밖에 있는 for문부터 확인해나간다.

# 중첩 list comprehension으로 2차원 배열 만들기
result = [ [ 0 for i in range(2) ] for j in range(3) ]   # [ [0, 0], [0, 0], [0, 0] ]

참고한 사이트

Python 공식 문서

블로그

profile
개발자가 되고 싶은 맽튜

1개의 댓글

comment-user-thumbnail
2024년 10월 19일

안녕하세요 덕분에 list comprehension 이해하는데 많은!! 도움이 되었습니다~
그런데 오타가 하나 있는 것 같아서 댓글 답니다.

pos = [ i*i for i in range(1, 4) for j in range(1, 3) ]
이 부분에서 의도하신 내용으로는 i * i 가 아니라 i * j가 되어야 할 것 같습니다 ^_^

답글 달기