Python/내장함수&기타

[Python/내장함수] lambda, map, filter, reduce 함수 사용법

(Python) lambda, map, filter, reduce 함수 사용법

[Python] lambda 함수, map 함수, filter 함수, reduce 함수 사용법


1. lambda 함수 사용법

lambda 함수

- lambda 매개변수 : 표현식

- 함수명 필요 없음

- 한줄로 표현 가능한 함수 

- 일반적인 함수처럼 정의해두고 필요할때마다 가져와서 쓰는것이 아니라, 필요한 곳에서 즉시 사용하고 버리는 일시적인 함수

- filter(), map(), reduce()등과 함께 사용하면 많은 응용이 가능해진다.

일반적인 함수

In [5]:
def multiply(a, b):
    return a*b

multiply(2, 3)
Out[5]:
6

함수 대신 lambda 사용

In [6]:
(lambda a,b : a*b)(2, 3)
Out[6]:
6

lambda를 변수에 넣어서 재사용하는 것도 가능하다.

In [7]:
m = lambda a,b: a*b

m(2, 3)
Out[7]:
6

lambda의 표현식 안에 조건문을 넣을 수 있다.

In [9]:
f = lambda a: "짝수이다." if a%2==0 else "홀수이다."

print("1", f(1))
print("2", f(2))
print("3", f(3))
print("4", f(4))
1 홀수이다.
2 짝수이다.
3 홀수이다.
4 짝수이다.

알고리즘 문제에서 정렬이 필요할 때, sort와 lambda를 이용할 떄가 많다.
특정 열(=col)에 대해서 혹은 어떤 조건에 따라 정렬을 해줘야 하기 떄문이다.

In [16]:
a = [
    [1, 1],
    [1, 3],
    [2, 1],
    [2, 2],
    [3, 6],
    [4, 4],
    ]
In [17]:
## 두번째 열에 대해서 오름차순으로 정렬해보자.

b = sorted(a, key = lambda x: x[1])
print(b)
[[1, 1], [2, 1], [2, 2], [1, 3], [4, 4], [3, 6]]
In [18]:
## 먼저 첫번째 열에 대해서 큰 순서대로 정렬을 해주고, 그 다음에 두번째 열에 대해서 작은 순서대로 정렬을 해보자.

c = sorted(a, key = lambda x: (-x[0], x[1]))
print(c)
[[4, 4], [3, 6], [2, 1], [2, 2], [1, 1], [1, 3]]
In [20]:
## sorted 대신 sort를 쓸 수도 있다.
## sort를 사용할 경우, 원래의 iterable 자료형이 수정된다.

## 첫번째 열에 대해서 작은 순서대로 정렬
a.sort(key = lambda x: x[0])
print(a)
[[1, 1], [1, 3], [2, 1], [2, 2], [3, 6], [4, 4]]

2. map() 함수 사용법

map() 함수

- map(함수, iterable 자료형)

- 리스트, 튜플, 문자열과 같은 iterable 자료형에서 각 요소(=element)들을 지정된 함수로 처리해주는 함수이다.

- 원본은 그대로두고, 새로운 iterable 자료형을 만든다.

In [11]:
for i in map(int, "12345"):
    print(i, type(i))
1 <class 'int'>
2 <class 'int'>
3 <class 'int'>
4 <class 'int'>
5 <class 'int'>
In [12]:
list(map(int, ['1', '2', '3', '4', '5']))
Out[12]:
[1, 2, 3, 4, 5]

함수 자리에 lambda를 넣어서 응용해보자.
2개 이상의 iterable 자료형을 입력값으로 받을 수 있다.

In [13]:
a = [1,2,3,4,5]
b = [5,4,3,2,1]

list(map(lambda x,y: x+y, a, b))
Out[13]:
[6, 6, 6, 6, 6]

알고리즘 문제 풀 때, 입력값을 받아야 하는 경우에 대해서 map() 함수를 사용하면 편리하다.

In [21]:
## '1 2 3' 과 같이 3개의 값을 입력받고 싶다.
q1, q2, q3 = map(int, input().split())
3 6 9
In [22]:
print(q1, q2, q3)
3 6 9
In [23]:
## 혹은 2차원 리스트를 입력받고 싶다.
## 임의로 4X4 크기의 리스트를 입력받아보자.

board = [list(map(int, input().split())) for _ in range(4)]
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
In [28]:
print(board, end='\n\n')

for i in board:
    print(i)
[[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]

[1, 1, 1, 1]
[2, 2, 2, 2]
[3, 3, 3, 3]
[4, 4, 4, 4]

3. filter() 함수 사용법

filter() 함수

- filter(함수, iterable 자료형)

- iterable 자료형의 요소(=element)들 중에서, 함수를 적용했을 때 True이면 남고, False이면 제거된다.

In [29]:
## 짝수만 뽑고 싶다.

a = [1,2,3,4,5,6,7,8,9,10]
list(filter(lambda x: x%2==0, a))
Out[29]:
[2, 4, 6, 8, 10]

4. reduce()함수 사용법

reduce() 함수

- from functools import reduce

- reduce(함수, iterable 자료형, initializer=None)
initializer은 선택사항

- 말로 설명하는 것보다는.. 직접 보는게 이해가 빠를 것 같다.

In [32]:
from functools import reduce
In [33]:
## 리스트 a안에 담겨있는 모든 요소(=element)들의 합을 구해보자.

a = [1, 2, 3, 4, 5]
reduce(lambda x,y: x+y, a)
Out[33]:
15
In [34]:
## 만약 초기값을 100으로 한다면?

reduce(lambda x,y: x+y, a, 100)
Out[34]:
115
In [37]:
## 이번엔 문자열을 더해보자.

b = "12345"

print('x+y :', reduce(lambda x,y: x+y, b))
print('y+x :', reduce(lambda x,y: y+x, b))
x+y : 12345
y+x : 54321
reduce(lambda x,y: y+x, b)을 보면
일단 초기값은 없는 상태이고
b = "12345"이다.

lambda x,y: 부분을 살펴보면 가장 처음에 x='1', y='2'를 가져온다.
y+x를 하면 '21'이 된다.
(가장 처음에 만약 초기값이 있었다면, x=초기값, y='1'이 되었을 것 같다. 하지만 초기값이 따로 존재하지 않기 떄문에 x='1', y='2'가 된 것 같다.)

다시 lambda x,y: y+x를 하게 되면, x='21', y='3'을 가져오고
y+x = '321'이 된다.

이를 반복하면 마지막 x='4321', y='5'이므로,
y+x = '54321'이 된다.