📍목표
- Python에서 reduce 사용하기
📍functools.reduce
예를 들어, 어떤 각각의 경우의 수를 나타내는 [1, 2, 3, 4, 5] 리스트가 있다고 할 때, 모든 경우의 수를 구하기 위해 이 리스트의 모든 원소를 곱하는 결과를 반환받고 싶다면 어떻게 할까?
for loop 를 사용할 수도 있지만, JavaScript의 reduce 같은 메서드를 사용해 결과를 깔끔하게 반환할 수도 있을 것이다.
Python에도 reduce 함수가 존재한다. functools 패키지에서 import 해오면 된다
from functools import reduce
기본 문법은 아래와 같다
reduce(function, iterable[, initializer])
- function: 2개의 인자를 받아(리스트 원소가 순차적으로 적용됨을 의미), 연산을 적용한 후 리턴해주는 함수를 넣는다.
lambda 함수를 넣으면 함수를 직접 선언하는 번거로움을 덜 수 있다
- iterable: reduce를 적용할 이터러블
- initializer: (옵셔널) 초기값을 넣는다. 가령 이터러블의 모든 덧셈을 한다면 0을 넣으면 되겠다. initializer를 넣지 않으면 자동으로 1번째, 2번째 원소부터 연산이 실행되므로 넣지 않아도 된다
📍예시
프로그래머스 <의상> 문제를 풀 때 사용해봤다. 자연수로 이루어진 리스트들에 각각 +1 해준 후 곱셈을 구하기 위해 사용했다.
예를 들면, [2, 2, 3] -> [3, 3, 4] -> 3 * 3 * 4 순으로 처리된다.
from functools import reduce
def solution(clothes):
dic = {}
for cloth, category in clothes:
if category in dic:
dic[category] += 1
else:
dic[category] = 1
return reduce(lambda x, y: x * y, [num + 1 for num in dic.values()]) - 1
reduce 를 사용하면 map 이나 for loop 을 사용한 결과가 이터러블이기 때문에 한 번 더 가공해야하는 수고를 덜 수 있으며 훨씬 Pythonic한 코드를 짤 수 있다!