파이썬 리스트 컴프리헨션 알아보기 (List Comprehension)

파이썬에서는 컴프리헨션 문법으로 간단하게 표현할 수 있습니다. 알고보면 매우 쉽지만 또, 처음엔 어색한 리스트 컴프리헨션을 이번 글에서 정리해 보도록 하겠습니다.

리스트 컴프리헨션이란?

컴프리헨션 (Comprehension)은 사전적으로 “이해력” 등의 뜻으로 주로 사용되는데요. 한 줄로 복잡한 반복문이나 조건문을 포괄적이고 간결하게 표현 할 수 있게 해주는 방법입니다. 컴프리헨션은 list, set, dictionary 자료형에 사용될 수 있습니다. 문법은 list, set, dictionary comprehension 이 동일하기 때문에, 이 글에서는 리스트 컴프리헨션(list comprehension)에 대해 알아보도록 하겠습니다.

기본 리스트 컴프리헨션 문법

[ 표현식 for 변수 in 반복가능한객체 ]

기본적인 문법은 위와 같은데요. 반복 가능한 객체, 예를 들면 리스트나 튜플, 문자열 등을을 넣을 수 있습니다.

  • 표현식 : 리스트에 담고 싶은 값 또는 연산식
  • 변수 : 반복문에서 사용하는 변수
  • 반복가능한 객체 : 리스트, 튜플, 문자열 등 반복 가능한 객체

만약 a = [ 1, 2, 3, 4 ] 일때 각 리스트 값에 2를 곱하도록 for 문을 이용하여 만들어 보겠습니다.

a = [1, 2, 3, 4]
result = []

for i in a:
    result.append(i * 2)  # 각 요소에 2를 곱한 값을 리스트에 추가

print(result)  # [2, 4, 6, 8]
Python

계산이 쉽기 때문에 사실 이렇게 사용해도 되지만 리스트 컴프리헨션을 이용하면 아래 처럼 한 줄로 간단하게 만들 수도 있습니다.

a = [1, 2, 3, 4]
result = [i * 2 for i in a]  # 각 요소에 2를 곱한 값을 리스트로 생성
print(result)  # [2, 4, 6, 8]
Python

조건을 사용하는 리스트 컴프리헨션

리스트 컴프리헨션으로 조건문을 이용하여 해당 조건에 맞는 값으로만 리스트를 만들수도 있는데요. 예를 들어 1~6까지 들어있는 a 리스트에서 짝수만 result 리스트로 만들고 싶다면 아래와 같이 작성할 수 있습니다.

a = [1, 2, 3, 4, 5, 6]
result = []

for i in a:
    if i % 2 == 0:  # 짝수인지 확인
        result.append(i)  # 짝수만 리스트에 추가

print(result)  # [2, 4, 6]
Python

한 줄이 더 생겼지만, 여전히 어렵지는 않죠. 이 소스를 리스트 컴프리헨션을 이용하면 아래와 같이 간단히 변형할 수 있습니다.

a = [1, 2, 3, 4, 5, 6]
result = [i for i in a if i % 2 == 0]  # 짝수만 리스트에 추가
print(result)  # [2, 4, 6]
Python

줄여진 형태를 보면 알 수 있습니다만, 조건을 사용하는 리스트 컴프리헨션은 아래와 같이 사용하게 됩니다.

[표현식 for 변수 in 반복가능한객체 if 조건]

조건문은 여러 조건을 조합하여 사용할 수 있습니다. 예를 들어 20보다 크고 50보다 작은 값을 result 에 담고 싶을 경우 아래와 같이 작성할 수 있습니다.

a = [10, 20, 30, 40, 50]
result = [i for i in a if i > 20 and i < 50]  # 20보다 크고 50보다 작은 값만
print(result)  # [30, 40]
Python

조건에 따라 다른 값을 넣고 싶을때 삼항연산자

위에서처럼 a 리스트의 값에서 조건에 따라 선택된 값에 동일한 계산식을 적용하고 싶은 경우 조건문을 뒤에 붙이면 된다고 했는데요. 이제는 조건에 따라 다른 계산식을 적용하는 방법을 알아보겠습니다.

[식1 if 조건 else 식2 for 변수 in 반복가능한객체]

  • 조건이 True 일때 사용할 값
  • 조건이 False 일때 사용할 값
a = [1, 2, 3, 4, 5, 6]
result = [i if i % 2 == 0 else -1 for i in a]  # 짝수는 그대로, 홀수는 -1
print(result)  # [-1, 2, -1, 4, -1, 6]
Python

중첩된 리스트 컴프리헨션

이제는 중첩된 리스트 컴프리헨션을 알아보도록 하겠습니다.

중첩 리스트 컴프리헨션 1

[ 표현식 for 변수1 in 반복가능한객체1 if 조건1 for 변수2 in 반복가능한객체2 if 조건2]

문법이 굉장히 복잡해 졌는데요. 하나 하나 살펴보면

  1. for 변수1 in 반복가능한객체1 if 조건1
    • 반복가능한객체1에서 조건1에 맞는 값을 변수1로 설정
  2. for 변수2 in 반복가능한객체2 if 조건2
    • 반복가능한객체2에서 조건2에 맞는 값을 변수2로 설정
  3. 이제 변수1에 저장된 리스트와 변수2에 저장된 리스트를 곱합니다.
a = [1, 2, 3]
b = ['a', 'b']

result = [(i, j) for i in a for j in b]
print(result)
Python

조건문을 제외한 중첩된 리스트 컴프리헨션인데요. 출력결과는 a 리스트와 b리스트의 곱

[(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (3, 'a'), (3, 'b')]
Python

이렇게 출력됩니다. a리스트에서 1을 가져온 후 b리스트에서 차례로 a, b를 가져와 (1, ‘a’), (1, ‘b’), 가 되며 2를 가져온 후 동일하게 (2, ‘a’), (2, ‘b’)가 3도 동일하게 가져와 이것을 다시 리스트로 만든것이죠.

중첩 리스트 컴프리헨션 2

만약 리스트가 중첩되어 있는 상황에서 해당 리스트의 모든 짝수값을 구하려면 어떻게 해야 할까요

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

라고 설정한다면 리스트 컴프리헨션을 두번 중첩하여 사용하면 쉽게 설정이 가능합니다.

  1. 먼저 [1, 2, 3] , [4, 5, 6], [7, 8, 9]로 된 외부 리스트를 컴프리헨션으로 가져옵니다.
    • for row in a
  2. 가져온 외부 리스트의 내부 리스트를 다시 컴프리헨션으로 하나씩 가져옵니다.
    • for i in row
  3. 내부 리스트의 값을 하나씩 가져오면서 조건문으로 짝수인지 확인합니다.
    • if i % 2 == 0

이제 위의 순서대로 한 줄로 조합해 보겠습니다.

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
result = [i for row in a for i in row if i % 2 == 0]  # 2차원 리스트에서 짝수만
print(result)  # [2, 4, 6, 8]
Python

복잡해 보이지만 하나씩 뜯어보면 사실 매우 쉽게 사용이 가능합니다. 위의 소스를 풀어서 사용하면 아래와 같이 사용할 수 있습니다.

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
result = []

for row in a:  # 각 행(row)을 반복
    for i in row:  # 각 행의 요소를 반복
        if i % 2 == 0:  # 짝수인 경우
            result.append(i)  # 리스트에 추가

print(result)  # [2, 4, 6, 8]
Python

중첩된 리스트 컴프리헨션과 비교하면 외부 for 문이 좌측에 내부 for문이 우측으로 되어 있는 것을 볼 수 있으며 조건문은 그 안에 있는 것을 볼 수 있습니다.

이렇듯 리스트 컴프리헨션은 좌측부터 우측으로 적용하게 됩니다. 때문에 아래와 같은 순서로는 사용이 불가능합니다.

result = [i for row in a if i % 2 == 0 for i in row]
Python

for row in a 다음에 if i % 2 == 0 을 적었는데요. 리스트 컴프리헨션은 위의 설명과 같이 좌측부터 해석하기 때문에 for row in a 다음에 오는 조건문에서 i는 아직 설정되지 않은 변수이기 때문에 에러가 발생합니다.

딕셔너리 컴프리헨션

리스트 컴프리헨션과 동일하게 컴프리헨션 문법으로 딕셔너리를 생성할 수 있습니다.

{ 키 : 표현식 for 변수 in 반복가능한객체 }

a = [1, 2, 3]
result = {i: i ** 2 for i in a}  # 각 숫자에 대한 제곱 값을 딕셔너리로 생성
print(result)  # {1: 1, 2: 4, 3: 9}
Python

세트 컴프리헨션

동일하게 세트도 컴프리헨션 문법으로 생성할 수 있습니다.

{ 표현식 for 변수 in 반복가능한객체 }

a = [1, 2, 2, 3, 3, 3]
result = {i for i in a}  # 중복을 제거한 세트를 생성
print(result)  # {1, 2, 3}
Python

제너레이터 컴프리헨션

리스트 대신 제너레이터도 컴프리헨션 문법으로 생성이 가능한데요. ( ) 괄호로 감싸주면 제너레이터 컴프리헨션으로 생성됩니다.

( 표현식 for 변수 in 반복가능한객체 )

a = [1, 2, 3, 4]
result = (i * 2 for i in a)  # 제너레이터를 생성
print(next(result))  # 2 출력
Python

이번 글에서는 파이썬의 리스트 컴프리헨션 문법에 대해서 알아봤습니다. 지금까지 안테나곰이었습니다.

댓글 남기기