Python - Lambda and List Comprehension

Page content

공지

제 수업을 듣는 사람들이 계속적으로 실습할 수 있도록 강의 파일을 만들었습니다. 늘 도움이 되기를 바라며. 참고했던 교재 및 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 사용자가 하려는 문법 (이번에는 곱셈을 해본다)
  • itemlist가 올것이다.
  • 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 ComprehensionLambda 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