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