요약
- 집계 함수를 누적으로 활용
functools
모듈의reduce
함수 사용- 기본문법:
reduce(집계함수, 데이터[, 초기값])
정리할것!
1. 집계 함수 누적 사용
ruduce
함수의 2가지 인자- 누적자(accumulator): 함수 실행 시작부터 끝까지 재사용되는 값
- 현재값(current value): loop시, 계속 변경되는 값
예제 1: 나이 합 구하기
- 유저들의 나이의 합 구하기(대상: 유저 정보(
users
) 딕셔너리의 의 나이열(age
)) - 초기값
0
이 세팅되고,age
의 값들이 누적으로 더해짐
users = [{'mail': 'gregorythomas@gmail.com', 'name': 'Brett Holland', 'sex': 'M', 'age': 73},
... {'mail': 'hintoncynthia@hotmail.com', 'name': 'Madison Martinez', 'sex': 'F', 'age': 29},
... {'mail': 'wwagner@gmail.com', 'name': 'Michael Jenkins', 'sex': 'M', 'age': 51},
... {'mail': 'daniel79@gmail.com', 'name': 'Karen Rodriguez', 'sex': 'F', 'age': 32},
... {'mail': 'ujackson@gmail.com', 'name': 'Amber Rhodes', 'sex': 'F', 'age': 42}]
from functools import reduce
# 초기값 0
reduce(lambda acc, cur: acc + cur['age'], users, 0)
예제 2: 성별 분류
- 사용자 정의 함수를 통해 그룹별 누적 집계로 활용 가능
- 유저들의 성별(
sex
)로 이름(name
) 분류하기
from functools import reduce
# case1: 사용자 정의 함수 사용
def names_by_sex(acc, cur):
sex = cur['sex']
if sex not in acc:
acc[sex] = []
acc[sex].append(cur['name'])
return acc
# 초기값 empty dictionary
reduce(names_by_sex, users, {})
# case2: 기본 lambda 활용
reduce(lambda acc, cur:
{**acc, cur['sex']: (acc[cur['sex']]
if cur['sex'] in acc else []) + [cur['name']]},
users, {})
2. 초기값의 중요성
주의사항
초기값 유무에 따라 결과가 달라짐
- 예제 1
- 초기값
0
설정하지 않으면,TypeError
- 초기값
- 예제 2
- 초기값
{}
설정하지 않으면, 두번째 인자가 list나 tuple 의 첫번째 값이 초기값으로 사용됨 - 기존 유저 정보(
users
)가 딕셔너리 형태로 숫자를 더하거나 키 추가시 에러 발생
- 초기값
참고사이트