컴프리헨션

리스트 컴프리헨션(List Comprehension)

파이썬은 리스트 컴프리헨션 표현식(list comprehension expression)이라는 고급 연산을 제공한다. 리스트 컴프리헨션은 (반환값으로 리스트를 만든다는 것을 암시하기 위해) 대괄호 안에 작성되며 표현식과 변수 이름을 공유하는(여기서는 row) 반복 구조로 구성된다.

list_ = [1, 2, 3]
list_ = [x + 1 for x in list_]
print(list_)
#--==>> [2, 3, 4]

리스트 컴프리헨션은 새로운 리스트를 만드는 방법이기 때문에 대괄호로 작성된다. 대괄호 안에 표현식(x + 1)을 작성하고 이후 for루프의 헤더부분과 같은 식을 작성한다. 그러면 인터프리터 내부에서 list_ 를 반복해서 값을 꺼내 x에 할당하고 이 x 값을 더 좌측에 있는 표현식(x + 1)에 할당해서 실행한 결과를 리스트에 담는다. 이 예시의 경우 list_ 에 저장된 리스트 1을 x에 할당, x=1을 x+1에 대입해서 2라는 결과를 리스트에 담는다. 그래서 list_는 [2, 3, 4]가 되는 것이다.

그리고 리스트 컴프리헨션은 for문과 다르게 새로운 리스트 객체를 생성한다. 그래서 아래 예제를 보면 리스트 컴프리헨션한 list_의 id값이 다름을 알 수 있다.

list_ = [1, 2, 3]
print(id(list_))
#--==>> 4343490560

for i in list_:
    list_[0] = list_[0] + 5
print(list_)
#--==>> [6, 7, 8]
print(id(list_))
#--==>> 4343490560

list_ = [i + 5 for i in list_]
print(list_)
#--==>> [11, 12, 13]
print(id(list_))
#--==>> 4345133248

리스트 컴프리헨션을 사용하면 열 또한 쉽게 가져올 수 있다.

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

col2 = [row[0] for row in m] # 첫 번째 열 아이템만 뽑아냄
print(col2)
#--==>> [2, 5, 8]

리스트 컴프리헨션은 아래 예시처럼 다양하게 사용할 수 있다.

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

print([row[0] + 1 for row in m])
# [2, 5, 8]
diag = [m[i][i] for i in [0, 1, 2]]
print(diag)
# [1, 5, 9]
doubles = [c * 2 for c in '가나다']
print(doubles)
# ['가가', '나나', '다다']

#range() 사용
print([[x ** 2, x * 3] for x in range(4)])
# [[0, 0], [1, 3], [4, 6], [9, 9]]

이처럼 리스트 컴프리헨션은 간결하다. 그리고 파이썬 코드에 따라 리스트 컴프리헨션의 반복은 인터프리터 내부에서 for 루프문보다 빠르게 실행될 수도 있다고 한다. 그래서 대규모 데이터를 처리하는 과정에서 리스트 컴프리헨션을 이용해 성능을 개선하기도 한다고 한다.

if

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

print([row[0] for row in m if row[0] % 2 == 0])
# [4]

이처럼 if 필터절을 추가할 수 있다. 이 예시는 첫번째 열에 짝수만 출력했다.

중첩 for

중첩된 for문을 리스트 컴프리헨션에 포함할 수 있다. 아래의 예시는 for문을 리스트컴프리헨션으로 작성하였다.

# 1
list_ = []
for i in 'abc':
    for j in 'def':
        list_.append(i + j)
print(list_)
#--==>> ['ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf']

# 2
print([x + y for x in 'abc' for y in 'def'])
#--==>> ['ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf']

set, dictionary

컴프리헨션을 통해 set와 dictionary를 만들 수도 있다.

set_ = {i+1 for i in range(5)}
print(set_)
#--==>> {1, 2, 3, 4, 5}

dict_ = {i : i+1 for i in range(5)}
print(dict_)
#--==>> {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}

 

 

'Python > Python' 카테고리의 다른 글

Python에서 집합을 사용하는 이유  (0) 2023.01.10
불변성과 문자열 수정  (0) 2023.01.06
반내림 vs 내림(Python3)  (0) 2023.01.05
__name__  (0) 2022.11.16
파이썬(Python), 파이참(PyCharm) 설치(windows)  (0) 2021.07.24