Python - Lambda and List Comprehension
공지
제 수업을 듣는 사람들이 계속적으로 실습할 수 있도록 강의 파일을 만들었습니다. 늘 도움이 되기를 바라며. 참고했던 교재 및 Reference는 꼭 확인하셔서 교재 구매 또는 관련 Reference를 확인하시기를 바랍니다.
I. 개요
Python을 활용한 데이터전처리를 수행할 때, Lambda and List Comprehension 활용하면 매우 handy한 경험을 할 수 있다. 특히, 코드 수행 시, for-loop가 많을 때 유용하다.
II. Lambda Expression

우선 Lambda의 표현 방법은 아래와 같다.
lambda 인자 : 표현식
어떻게 사용할 수 있을까요? 우선, temp_sum이라는 함수를 만들어 본다.
def temp_sum(x, y):
return x + y
temp_sum(1, 4)
5
이번에는 lambda를 활용해서 sum을 적용해보자.
temp_sum = (lambda x,y:x+y)(1, 4)
print(temp_sum)
5
하나는 함수를 만들어서 사용했고, lambda를 활용할 때는 함수를 쓰지 않고 작성했다.
한가지 특징이 있다면, 일반적으로 함수는 return 문이 존재하지만, lambda는 없다는 점이다.
III. With functions
그런데, lambda 자체가 독립적으로 쓰일 때 보다는 map(), filter(), list comprehesion과 같이 쓰일 때, 보다 효율적이다.
(1) map()
문법은 아래와 같다.
map(func, iterables)
map()함수는 함수와 인자를 받는데, 이때의 함수라 하면,lambda도 포함한다.iterables나오는데, 이는 일반적인list와는 다르다.- 따라서,
map()의 결과값은iterables로 반환되며,list로 변환해야list형태로 결과를 볼 수 있다. - 조금 더 구체적으로
map의 사용용법은 아래와 같다.
list(map(func, iterables))
이제 list 객체에 map() + lambda를 활용해서 각 list에 3씩 구하도록 한다.
num_list = [5, 6, 7]
increased = list(map(lambda x: x +3, num_list))
print(increased)
[8, 9, 10]
(2) filter()
이번에는 filter() 함수를 활용한다. map()와 마찬가지로 문법은 동일하다.
filter(func, iterables)
iterables에 대해서는 별도로 추가적인 설명하지 않는다.list로 받았기 때문에, 이번에도list로 변환해서 출력을 한다.list안에 있는 각각의 값에서,2로 나눈 값이 0이 아닌 것만 출력하는 구문을 짜도록 한다. 기대하는 값은[5,7]이다.
num_list = [5, 6, 7]
odd_num = list(filter(lambda x: x%2 != 0, num_list))
print(odd_num)
[5, 7]
(3) List Comprehension
우선 문법을 보자.
[expression for item in list if condition]
위 구문을 가지고 무엇을 하고 싶을 때 써야할까?
expression사용자가 하려는 문법 (이번에는 곱셈을 ��본다)item은list가 올것이다.if는 item의 각 아이템을 조건문으로filter하는 개념이다.
우선 아래 코드를 보자.
num_list = [1,2,3,4,5,6,7,8,9,10]
sqrt_list = [x*x for x in num_list if x%2==0]
print(sqrt_list)
[4, 16, 36, 64, 100]
1-10까지 숫자를 포함하는 리스트가 있다. 2로 나눈 값 중 나머지가 0이 되는 값을 뽑은 뒤 각 숫자의 제곱을 하도록 반환하는 값이다.
List Comprehension의 강력함은 이렇게 여러 문법이 한줄로 코딩하여 속도 뿐만 아니라 코드의 가독성도 부여하는데 의의가 있다.이번에는
lambda를 적용한다. 우선lambda는 어디에 들어가야 할까? 당연한 말이지만,expression영역에 들어가야 한다. 우선 아래 코드를 확인해보자.
num_list = [1,2,3,4,5,6,7,8,9,10]
sqrt_list = [(lambda x: x*x)(x) for x in num_list if x%2==0]
print(sqrt_list)
[4, 16, 36, 64, 100]
lambda를 어떻게 썼는지 확인해보면(lambda x: x*x)(x)라고 표현되어 있는 것을 볼 수 있는데, 앞 부분에서lambda expression(Chapter 2)에 대해 설명했기 때문에 생략한다.위 코드에서 보는 것처럼,
List Comprehension과Lambda Expression을 같이 쓰는 것은 조금 비효율적일 수 있다.
IV. More Study
기본문법이다. 그런데, 아직까지 확실히 Lambda가 좋은지는 필자 역시 모르겠다. 그런데, Lambda가 데이터 전처리 때, 사용하면 매우 강력한 무기가 될 수 있음을 다음 포스트에서 기술하려고 한다.
Reference
Suvhotta. (2020, January 27). Python: Lambda and List Comprehension. Retrieved May 12, 2020, from https://dev.to/suvhotta/python-lambda-and-list-comprehension-5128