Python | list comprehension

김민철·2021년 2월 25일
1
post-thumbnail

소개

파이썬에는 리스트 컴프리헨션이라는 보기에도 편하고 속도도 빠른 표현식이 있습니다.

간단히 설명하면, 리스트 컴프리헨션은 시퀀스 객체에 대해 표현식을 적용합니다.

용어들을 먼저 보겠습니다.

  • 시퀀스 자료형 : 각각의 요소들이 연속적으로 이어진 자료형 (리스트, 튜플, range, 문자열, bytes, bytearray)
  • 표현식 : 값을 부여, 또는 계산하는 형태의 수식을 의미 (ex. 10, 5/3+2)

이 정의를 바탕으로 풀어보면, 리스트 컴프리헨션은 요소들이 연속적으로 이어지는 객체에 대해 작용하는 표현식입니다.

이제 이름을 더 자세히 살펴보겠습니다.
comprehension(컴프리헨션) 에는 '이해' 라는 뜻이 주로 쓰이지만, '포함' 이라는 뜻도 존재합니다. 앞 정의와 합쳐서 풀이해보면 '표현식을 통해 생성된 객체들을 리스트로 포함시킨 것' 으로 해석이 가능합니다.

형태와 기능

리스트 컨프리헨션의 기본 형태입니다.
[ 표현식 for 대상 in 반복 객체 ]

리스트 컴프리헨션은 반복 객체에서 요소를 꺼내고, 꺼낸 요소에 표현식을 적용해 리스트를 생성합니다.

그러면 이제 간단히 리스트 컴프리헨션을 사용해 보겠습니다.


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

>>> l =[str for x in a] #잘못 입력했지만, 리스트 컨프리헨션이 어떻게 작동하는지 알기 편했습니다
>>> l
[<class 'str'>, <class 'str'>, <class 'str'>, <class 'str'>]


>>> l = [str(x) for x in a]
>>> l
['1', '2', '3', '4']

>>> [ x * 2 for x in a]
[2, 4, 6, 8]

리스트 컨프리헨션은 임의의 표현식을 반복 객체에 적용하고자 할 때 더욱 편리합니다.

기본 for 루프문 과 동일하게 이중 for 루프문도 역시 가능합니다.

>>> [x+y for x in [0,1,2] for y in [10,9,8]]
[10, 9, 8, 11, 10, 9, 12, 11, 10]

특히나 리스트 컨프리헨션을 사용하면 행렬을 다룰 때 편리합니다.

>>> M
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]

>>> M[2]
[7, 8, 9]

>>> [row[2] for row in M]
[3, 6, 9]

>>> [M[row][2] for row in (0,1,2)]
[3, 6, 9]

열에 대한 출력을 쉽게 만들어줍니다.

map

파이썬에는 반복객체에 함수를 적용하는 map 이라는 함수도 있습니다. map 을 사용해 똑같은 결과를 만들어 보겠습니다.

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

>>> m = list(map(str,a))
>>> m
['1', '2', '3', '4']

map 에서 표현식을 사용하려면 lambda 를 사용해 줍니다.

>>> list(map((lambda x: x*2), a))
[2, 4, 6, 8]

정리

리스트 컴프리헨션은 반복 객체에 대해 표현식을 실행합니다.
map 은 반복객체에 대해 함수를 실행합니다. 둘 간의 속도는 코드에 따라 다릅니다. 보통 함수 호출, 내장 함수 등을 적용해야 할 경우에는 map이 더 빠릅니다.

리스트 컴프리헨션을 for 루프문과 비교해보면, 속도에서 빠르고 for 루프문이 올 수 없는 리스트, 딕셔너리 내부 등에서 사용이 가능합니다. 더불어 가독성 또한 좋습니다.

하지만 우리는 대부분 협업을 통해 개발을 합니다. 무리한 리스트 컴프리헨션은 가독성에 영향을 줄 수 있기에, 명확히 알 수 있게 for 루프 문을 사용하거나 주석을 붙혀서 협업에 용이하게 해주어야 합니다.

0개의 댓글