쿼카러버의 기술 블로그
[Python Advanced] reduce 함수란? (쉬운 설명 & 다양한 예시) 본문
Reduce
reduce()함수는 여러개의 데이터를 대상으로 누적 집계를 내기 위해 사용되는 함수다.
reduce함수를 한 줄로 설명하자면 iterable를 단일 값으로 줄이기(reduce)위해 iterable의 element들을 왼쪽에서 부터 오른쪽으로 매개변수로 넘어온 함수에 대해 누적적용하는 built-in함수다.
당연히 내가 써놓고도 무슨말인지 잘 모르겠다. 이해하고보면 잘 정리가 된 글이지만, 이런 류는 그냥 예시를 보고 이해하는게 가장 편하다.
특징
reduce(집계 함수, 순회 가능한 데이터[, 초기값])
- 집계 함수는 두 개의 인자를 받는다. 첫 번째 인자는 누적자(accumulator), 두 번째 인자는 현재값이 넘어오게 된다. 누적자는 함수 실행의 시작부터 끝까지 계속해서 재사용되고, 현재값은 루프를 돌면서 계속해서 바뀐다.
예를 들어 아래 예제를 보면 1, 2, 3, 4, 5를 전부 더한 결과를 반환한다.
from functools import reduce
result = reduce(lambda acc, value: acc + value, [1, 2, 3, 4, 5])
# ((((1+2)+3)+4)+5)
근데 reduce는 아래처럼 초기값을 설정할 수도 있다.
result = reduce(lambda acc, value: acc + value, [1, 2, 3, 4, 5], 100)
# 100 + ((((1+2)+3)+4)+5)
위에서 알 수 있듯이 가장 초기값을 100으로 설정해두고 위 함수를 실행하면 115가 리턴된다.
사용 예시
누적 연산
from functools import reduce
def Sum(x, y):
return x + y
result = list(range(1, 21))
print(reduce(Sum, result))
# 실행 결과: 210 (1부터 20까지 더한 값)
최대 값 구하기
- 누적값 말고도 아래처럼 최대값을 구하는데 사용할 수도 있다.
from functools import reduce
func = lambda a, b: a if (a > b) else b
result = reduce(func, [1, 100, 2, 55])
print(result)
Dictionary활용 데이터 실습
faker를 활용해 가짜 데이터를 만들어보자
from functools import reduce
from faker import Faker
fake = Faker()
users = [{"name":fake.name(), "age":fake.random_int(0, 100), } for x in range(10)]
language = ['korean','english','german']
for i in range(len(users)):
users[i]["language"] = language[i%3]
print(users)
total age구하기
이제 reduce를 사용해 total age를 구해보자
accum_age = reduce(lambda acc, val: acc + val['age'], users, 0)
- 위와 같이 dict를 iterate하는 경우 초기 누적값을 세팅해주어야 한다.
language별로 그루핑
def reducer(acc, val):
acc[val["language"]].append(val["name"])
return acc
users_by_language = reduce(reducer, users, defaultdict(list))
print(users_by_language)
lambda함수의 쉬운 설명과 다양한 예시가 궁금하다면 아래 글을 참고하기를 바란다.
https://etloveguitar.tistory.com/97
또, 파이썬에서 자주 사용되는 내장함수인 각 map, filter에 대해 글을 정리해두었는데, 필요하다면 참고하길 바란다.
클릭!!
[Python Advanced] map함수란? (쉬운 설명 & 다양한 예시)
[Python Advanced] filter 함수란? (쉬운 설명 & 다양한 예시)
참고자료
https://zetcode.com/python/faker/
'[Python]' 카테고리의 다른 글
Comments