Summary
reduce는 집계 함수를 누적으로 적용하는functools모듈의 함수다- 기본 문법은
reduce(집계함수, 데이터[, 초기값])이며, 누적자(acc)와 현재값(cur) 두 인자를 받는다- 초기값 유무에 따라 결과가 달라지므로 딕셔너리 누적 시 특히 주의한다
누적 집계
reduce는 데이터를 순회하며 집계 함수를 누적으로 적용하는 함수다. 집계 함수는 두 인자를 받는다.
- 누적자(accumulator): 시작부터 끝까지 재사용되는 값
- 현재값(current value): loop마다 계속 바뀌는 값
예제 1 — 나이 합 구하기
초기값 0이 세팅되고, 각 유저의 age가 누적으로 더해진다.
users = [
{'name': 'Brett Holland', 'sex': 'M', 'age': 73},
{'name': 'Madison Martinez', 'sex': 'F', 'age': 29},
{'name': 'Michael Jenkins', 'sex': 'M', 'age': 51},
]
from functools import reduce
reduce(lambda acc, cur: acc + cur['age'], users, 0)예제 2 — 성별로 이름 분류
사용자 정의 함수로 그룹별 누적 집계도 할 수 있다. 성별(sex)을 키로 이름(name)을 모은다.
from functools import reduce
def names_by_sex(acc, cur):
sex = cur['sex']
if sex not in acc:
acc[sex] = []
acc[sex].append(cur['name'])
return acc
reduce(names_by_sex, users, {})초기값의 중요성
주의사항
초기값 유무에 따라 결과가 달라진다.
- 예제 1: 초기값
0을 설정하지 않으면TypeError- 예제 2: 초기값
{}를 설정하지 않으면 리스트의 첫 값이 초기값으로 쓰여, 딕셔너리에 숫자를 더하거나 키를 추가할 때 에러가 발생한다
Reference