reduce
reduce 함수 사용을 위해서는 functools를 import 해야 한다.
functools.reduce(function, iterable[, initializer])
reduce 함수를 사용하면 첫 번째 인자로 들어가는 function을 사용해서 iterable 한 값을 하나의 값으로 줄일 수 있다.
initializer는 주어지면 첫 번째 인자로서 추가된다.
즉, 두 개의 입력을 하나의 결과로 만들 수 있다.
주어진 데이터들의 합을 구하는 함수를 작성해본다.
dataset = [1, 2, 3, 4]
def total(numbers):
result = 0
for number in numbers:
result += number
return result
total(dataset)
Out : 10
total(dataset)의 결과로는 10이 도출된다. 이는 아래와 같은 과정을 거친다.
0 | 1, 2, 3, 4
1
3
6
10
위 과정을 함수로 만들지 않고 reduce 함수를 사용하면 간략하게 표현할 수 있다.
def add(x, y):
print(x, y)
return x + y
reduce(add, [1, 2, 3, 4, 5])
1, 2, 3, 4, 5
↓ ↓
add(1, 2)
↓ ↙
3, 3, 4, 5
↓ ↓
add(3, 3)
↓ ↙
6, 4, 5
↓ ↓
add(6, 4)
↓ ↙
10, 5
add(10, 5)
↓ ↙
15
reduce 함수 실행 시 위와 같은 과정을 거쳐 하나의 값이 반환된다.
1 2
3 3
6 3
10 5
Out : 15
차례대로 1 2, 3 3, 6 3, 10 5가 출력되고 결과 값으로는 15가 나온다.
reduce + lambda
reduce 함수의 첫 번째 인자로 lambda 표현식을 넣을 수 있다.
lambda 표현식 자체를 넣어도 되고, lambda 표현식을 저장한 변수를 넣어도 된다.
reduce(lambda x, y : x + y, [1, 2, 3, 4, 5])
sum_all = lambda numbers : reduce(lambda a, b : a + b, numbers)
sum_all([1, 2, 3, 4, 5])
예제
initializer (초기 값)
reduce 함수를 사용해 초기 값을 지정할 수 있다.
def func(a, b):
a.append(b ** 2)
return a
reduce(func, [1, 2, 3], [])
Out : [1, 4, 9]
위 reduce 함수는 아래와 같은 과정을 거치며 초기 값을 지정한다.
[] | [1, 2, 3]
↓ ↓
func([], 1)
↓
[1] 2, 3
↓ ↓
func([1], 2)
↓
[1, 4] 3
↓ ↓
func([1, 4], 3)
↓
[1, 4, 9]
위 방법은 func(a, b) 함수를 만들어 사용하였지만 lambda 표현식을 써서도 가능하다.
reduce(lambda a, b : a + [b ** 2], [1, 2, 3], [])
그러나 위처럼 lambda 표현식을 사용하는 방법은 성능이 나쁘기 때문에 추천하지는 않는다.
최대 값 찾기
dataset = [1, 4, 8, 5, -20]
reduce(
lambda a, b : a if a > b else b,
dataset
)
Out : 8
각 아이템별 개수 구하기
각 아이템별 개수를 구하는 것은 for문을 사용해서 구할 수도 있지만 reduce 함수를 사용하면 for문을 사용한 것보다 조금 더 간결하게 만들 수 있다.
첫 번째로 for문을 사용한 코드이다.
dataset = ['dog', 'dog', 'cat', 'dog', 'cat', 'bird']
def count_element(elements):
result = {}
for element in elements:
result[element] = result.get(element, 0) + 1
return result
count_element(dataset)
두 번째로는 reduce 함수를 사용한 것이다.
def inner_func(result, element):
result[element] = result.get(element, 0) + 1
return result
reduce(inner_func, dataset, {})
Out : {'dog' : 3, 'cat' : 2, 'bird' : 1}
reduce 함수와 lambda 표현식을 함께 사용해 만들 수도 있다.
reduce (
lambda r, e: r.update({e: r.get(e, 0) + 1}) or r,
dataset,
{}
)
dict.update()는 인자 값이 dict 내에 존재하지 않으면 추가하고, 존재하면 None을 리턴한다.
dict.get()은 인자 값이 dict 내에 존재하면 가져오고, 존재하지 않는다면 None을 리턴한다.
reduce
reduce 함수 사용을 위해서는 functools를 import 해야 한다.
functools.reduce(function, iterable[, initializer])
reduce 함수를 사용하면 첫 번째 인자로 들어가는 function을 사용해서 iterable 한 값을 하나의 값으로 줄일 수 있다.
initializer는 주어지면 첫 번째 인자로서 추가된다.
즉, 두 개의 입력을 하나의 결과로 만들 수 있다.
주어진 데이터들의 합을 구하는 함수를 작성해본다.
dataset = [1, 2, 3, 4]
def total(numbers):
result = 0
for number in numbers:
result += number
return result
total(dataset)
Out : 10
total(dataset)의 결과로는 10이 도출된다. 이는 아래와 같은 과정을 거친다.
0 | 1, 2, 3, 4
1
3
6
10
위 과정을 함수로 만들지 않고 reduce 함수를 사용하면 간략하게 표현할 수 있다.
def add(x, y):
print(x, y)
return x + y
reduce(add, [1, 2, 3, 4, 5])
1, 2, 3, 4, 5
↓ ↓
add(1, 2)
↓ ↙
3, 3, 4, 5
↓ ↓
add(3, 3)
↓ ↙
6, 4, 5
↓ ↓
add(6, 4)
↓ ↙
10, 5
add(10, 5)
↓ ↙
15
reduce 함수 실행 시 위와 같은 과정을 거쳐 하나의 값이 반환된다.
1 2
3 3
6 3
10 5
Out : 15
차례대로 1 2, 3 3, 6 3, 10 5가 출력되고 결과 값으로는 15가 나온다.
reduce + lambda
reduce 함수의 첫 번째 인자로 lambda 표현식을 넣을 수 있다.
lambda 표현식 자체를 넣어도 되고, lambda 표현식을 저장한 변수를 넣어도 된다.
reduce(lambda x, y : x + y, [1, 2, 3, 4, 5])
sum_all = lambda numbers : reduce(lambda a, b : a + b, numbers)
sum_all([1, 2, 3, 4, 5])
예제
initializer (초기 값)
reduce 함수를 사용해 초기 값을 지정할 수 있다.
def func(a, b):
a.append(b ** 2)
return a
reduce(func, [1, 2, 3], [])
Out : [1, 4, 9]
위 reduce 함수는 아래와 같은 과정을 거치며 초기 값을 지정한다.
[] | [1, 2, 3]
↓ ↓
func([], 1)
↓
[1] 2, 3
↓ ↓
func([1], 2)
↓
[1, 4] 3
↓ ↓
func([1, 4], 3)
↓
[1, 4, 9]
위 방법은 func(a, b) 함수를 만들어 사용하였지만 lambda 표현식을 써서도 가능하다.
reduce(lambda a, b : a + [b ** 2], [1, 2, 3], [])
그러나 위처럼 lambda 표현식을 사용하는 방법은 성능이 나쁘기 때문에 추천하지는 않는다.
최대 값 찾기
dataset = [1, 4, 8, 5, -20]
reduce(
lambda a, b : a if a > b else b,
dataset
)
Out : 8
각 아이템별 개수 구하기
각 아이템별 개수를 구하는 것은 for문을 사용해서 구할 수도 있지만 reduce 함수를 사용하면 for문을 사용한 것보다 조금 더 간결하게 만들 수 있다.
첫 번째로 for문을 사용한 코드이다.
dataset = ['dog', 'dog', 'cat', 'dog', 'cat', 'bird']
def count_element(elements):
result = {}
for element in elements:
result[element] = result.get(element, 0) + 1
return result
count_element(dataset)
두 번째로는 reduce 함수를 사용한 것이다.
def inner_func(result, element):
result[element] = result.get(element, 0) + 1
return result
reduce(inner_func, dataset, {})
Out : {'dog' : 3, 'cat' : 2, 'bird' : 1}
reduce 함수와 lambda 표현식을 함께 사용해 만들 수도 있다.
reduce (
lambda r, e: r.update({e: r.get(e, 0) + 1}) or r,
dataset,
{}
)
dict.update()는 인자 값이 dict 내에 존재하지 않으면 추가하고, 존재하면 None을 리턴한다.
dict.get()은 인자 값이 dict 내에 존재하면 가져오고, 존재하지 않는다면 None을 리턴한다.