본문 바로가기
Python

[Python] map() filter() reduce() 사용법 정리

by 까리한 새우 2025. 1. 17.

Java 언어를 메인으로 하는 개발자 11일차인 나는 자기계발을 위해 python도 퇴근 후 깨잘깨잘 공부하고 있다.

하루에 투자하는 시간이 적고 아직 익숙하지 않기에 조금씩 정리를 하기로 마음을 먹었다.

조만간은 Python 공부의 목표인 '비트코인 선물거래 자동화 프로그램' 을 만드는 과정?을 포스팅해보려 한다.

 

우선 그 엄청난 목표를 향한 과정인 map 과 filter, reduce에 대해 정리해보자 (자꾸 헷갈린다....)

 


map(function, iterable, ...)

 

map이든 filter 이든 reduce 이든 인자값으로 function 과 iterable 을 받고있다.

function은 함수(혹은 어떤 조건)를 의미하고 iterable 은 반복가능한 자료인 배열, 리스트, 튜플 등을 의미한다.

 

>>> list1 = [1, 2, 3, 4, 5]
>>> map(lambda x: x * 2, list1)
<map object at 0x10d1883d0>

위 코드는 1부터 5까지의 값을 가지는 리스트를 iterable 로 넘겨주고 첫 번째 함수 인자값에는 함수(조건)을 넣어주었다.

 

간단하게 해석해보면, list1에 있는 값들을 하나씩 꺼내와서 변수 x에 둔다. 

변수 x 에 곱하기 2를 계산한 값을 map 에 담아놓는 코드이다.

 

map()을 수행한 결과는 map object 로 반환되기 때문에, 이를 리스트나 튜플로 바꾸어주어야 한다.

>>> list1 = [1, 2, 3, 4, 5]
>>> print(list(map(lambda x: x * 2, list1)))
[2, 4, 6, 8, 10]

 

 

또한, 함수 정의를 보면 'iterable' 뒤에 ... 이 붙은 것을 볼 수 있다.

여러 iterable 을 인자값으로 줄 수 있다는 뜻이다. 

>>> list1 = [1, 2, 3, 4, 5]
>>> list2 = [6, 7, 8, 9, 10]
>>> result = list(map(lambda x, y: (x*2, y*2), list1, list2))
>>> print(result)
[(2, 12), (4, 14), (6, 16), (8, 18), (10, 20)]

위와 같이 list1 과, list2를 넘겨주게 되면 각 리스트들에서 하나씩 가져와서 처리하게 된다.

 

만약, 두 개의 리스트의 길이가 다르다면?

>>> list1 = [1, 2, 3, 4]
>>> list2 = [6, 7, 8, 9, 10]
>>> result = list(map(lambda x, y: (x*2, y*2), list1, list2))
print(result)

제일 작은 리스트의 길이만큼만 반복하게 된다.


 

filter(function, iterable)

 

filter 함수도 map과 유사한 부분이 많다.

첫 번째 인자값으로는 function, 두번째로는 iterable 을 주면 되는데 ... 이 붙어 있지 않으니 하나의 반복 요소만 주도록 하자.

filter 함수 또한 결과로 filter object 를 반환하므로 리스트로 바꾸어서 출력해준다.

>>> list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> result = list(filter(lambda x: x % 2 == 0, list1))
>>> print(result)
[2, 4, 6, 8, 10]

위 코드는 list1 요소를 하나씩 가져와 x의 변수에 담고 x % 2 == 0 의 조건이 성립하는지 확인한다.

확인 후 조건이 성립한다면, 값을 담아서 object 에 담아 반환한다.

 

여기서 map() 과 filter() 의 차이를 캐치했는가??

 

map() 함수는 모든 요소의 변환 함수를 일괄 적용하여 반환하는 것이고

filter() 함수는 모든 요소에 조건 함수를 적용하여 True를 반환하는 요소만 반환하는 함수이다.

 


reduce(function, iterable[, initializer])

 

reduce() 함수는 파이썬 3으로 오면서 내장함수에서 빠지게 되어, functools 모듈을 따로 import 하여 사용해야 한다.

내가 파이썬을 처음 배울 때, 좀 헷갈리던 함수중에 하나였다.

 

reduce() 함수는 iterable 의 모든 요소를 누적 연산해가며 단 하나의 값으로 축약하는 함수이다.

>>> from functools import reduce

>>> list1 = [1, 2, 3, 4, 5]

>>> result = reduce(lambda x, y: x + y, list1)
>>> print(result)
15

 

이 함수가 어떻게 동작하는지 천천히 이해해보자.

 

우선, lambda 에서 x와 y에 값을 주어야 하기 때문에 list1에서 두 개의 요소를 전달한다.

그럼 처음에는 1 + 2 가 되어 초기값은 3이 된다.

 

다음 x, y에 값을 줄때는 list1 의 요소인 3, 4 를 주는 것이 아닌, 이전에 계산한 결과값인 3을 x에 전달하고 list1의 요소를 y에 전달한다. 그렇게 되면 x는 3, y는 3이 전달되어 x + y = 6의 결과가 나온다.

 

다음 반복에도 x에는 이전의 결과값인 6이 전달되고 y는 list1의 요소인 4가 전달되어 10의 결과값이 나오고, 마지막 연산에는 x에는 10이 전달되고 y는 list1 마지막 요소인 5가 전달되어 최종적인 합인 15가 반환되게 된다.

 

x에는 이전의 결과값이 전달된다고 이해하면 쉬운데

단지 맨 처음 계산에는 이전의 값이 없기 때문에 list1 요소 두 개를 꺼내다 쓴 것이다.

 

>>> from functools import reduce

>>> list1 = [1, 2, 3, 4, 5]

>>> result = reduce(lambda x, y: x + y, list1, 5)
>>> print(result)
20

함수 정의를 보면 initializer 가 붙어 있는데, 이것은 초기값(혹은 기본값)을 의미한다.

 

처음에 x에 전달될 기본값을 설정하는 것으로, 위 코드에서 5를 인자값으로 전달하였는데 그렇게 되면 첫 계산에 x에 5가 전달되고 y는 list1의 첫 번째 요소인 1이 전달되어 6의 결과값을 만들어내고 이후 반복을 진행한다.

 

그러니까 최종 결과가 20이 나오겠쬬?

반응형