Сворачивание списка с помощью функции reduce()

Опубликован: 01.12.2023 78

В Python есть простая, но одновременно мощная функция reduce() из модуля functools, позволяющая "сворачивать" итерируемую последовательность, сводя ее к единственному значению.

Функция reduce() принимает функцию и итерируемый объект в качестве параметров и применяет полученную функцию к парам значений из итерируемого объекта, пока не останется только одно значение.

Синтаксис: reduce( function, iterable [, initializer] )

  • function - функция, которая кумулятивно применяется к парам элементов итерируемой последовательности, сводя ее к единственному значению;
  • iterable - итерируемая последовательность;
  • initializer - базовое значение, с которого требуется начать отсчет (необязательный аргумент).
from functools import reduce

# сворачивание списка с помощью вычисления факториала
numbers = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x * y, numbers, 1)
print(result)
120

# сворачивание списка суммированием (нарастающим итогом)
numbers = [1, 2, 3, 4, 5]
total  = reduce(lambda x, y: x + y, numbers)
print(total)
15

Функцию reduce() можно эффективно использовать не только для сворачивания списков, но и для обработки других итерируемых последовательностей.

Например, если у вас есть словарь с числовыми значениями и необходимо получить их сумму, то вместо использования цикла for для перебора всех элементов словаря, можно применить более короткое и эффективное решение с функцией reduce():

dict_data = {"Петров": 4, "Иванов": 5, "Сидоров": 3, "Cмирнов": 7}
print(reduce(lambda x, key: x + dict_data[key], dict_data, 0))
19

Пример вычисления последовательности Фибоначчи с помощью функции reduce().

Числа Фибоначчи - числовая последовательность, в которой первые два числа равны 0 и 1, а каждое последующее число равно сумме двух предыдущих.

Для вычисления элементов последовательности Фибоначчи можно использовать функцию reduce():

# вычисление последовательности Фибоначчи
fib = lambda n: reduce(lambda x, _: x+[x[-1]+x[-2]], range(n-2), [0, 1])
fib(15)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

Отличие функции reduce() от аналогичной функции accumulate().

Основное отличие между функциями functools.reduce() и itertools.accumulate() заключается в том, что:

  • функция reduce() сохраняет промежуточный результат и возвращает только итоговое значение суммирования;
  • функция accumulate() возвращает итератор, содержащий промежуточные результаты вычислений и итоговое значение.
from functools import reduce
from itertools import accumulate

list_a = [15, 30, 20, 10, 25]

print(f"Сумма списка с помощью accumulate() : {list(accumulate(list_a, lambda x, y: x+y))}")
Сумма списка с помощью accumulate() : [15, 45, 65, 75, 100]

print(f"Сумма списка с помощью reduce() : {reduce(lambda x, y: x+y, list_a)}")
Сумма списка с помощью reduce() : 100

Похожие посты

Методы преобразования списка в строку и обратно

Удаление дубликатов из списка

Подсчет количества вложенных списков в списке

Поэлементное суммирование списков (кортежей)

Комментариев нет.