Что это за функция, подобная sum(), но предназначенная для умножения?продукт()?

StackOverflow https://stackoverflow.com/questions/595374

  •  09-09-2019
  •  | 
  •  

Вопрос

Питоновский sum() функция возвращает сумму чисел в итерируемом файле.

sum([3,4,5]) == 3 + 4 + 5 == 12

Я ищу функцию, которая вместо этого возвращает продукт.

somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60

Я почти уверен, что такая функция существует, но я не могу ее найти.

Это было полезно?

Решение

На самом деле, Гвидо наложил вето на эту идею: http://bugs.python.org/issue1093

Но, как отмечалось в том выпуске, вы можете сделать это довольно легко:

from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator

reduce(operator.mul, (3, 4, 5), 1)

Другие советы

Обновить:

В Python 3.8 подталкивать функция была добавлена в математика модуль.Видишь: математический прод().

Более старая информация:Python 3.7 и более ранние версии

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

Заявление о prod()

Да, это верно.Гвидо отверг эту идею для встроенной функции prod(), потому что он думал, что это редко требуется.

Альтернатива с reduce()

Как вы предположили, нетрудно создать свой собственный, используя уменьшить() и оператор.mul():

from functools import reduce
def prod(iterable):
    return reduce(operator.mul, iterable, 1)

>>> prod(range(1, 5))
24

В Python 3, the уменьшить() функция была перемещена в модуль функциональных инструментов, поэтому вам нужно было бы добавить:

from functools import reduce

Конкретный случай:Факториалы

В качестве дополнительного примечания, основной мотивирующий пример использования для толчок() заключается в вычислении факториалов.У нас уже есть поддержка для этого в математический модуль:

>>> import math

>>> math.factorial(10)
3628800

Альтернатива с логарифмами

Если ваши данные состоят из значений с плавающей запятой, вы можете вычислить продукт, используя сумма() с экспонентами и логарифмами:

>>> from math import log, exp

>>> data = [1.2, 1.5, 2.5, 0.9, 14.2, 3.8]
>>> exp(sum(map(log, data)))
218.53799999999993

>>> 1.2 * 1.5 * 2.5 * 0.9 * 14.2 * 3.8
218.53799999999998

Обратите внимание, что использование журнал () требуется, чтобы все входные данные были положительными.

Встроенного устройства нет, но его легко создать самостоятельно, как показано на примере здесь:

import operator
def prod(factors):
    return reduce(operator.mul, factors, 1)

Смотрите ответы на этот вопрос:

Какой модуль Python подходит для манипулирования данными в списке?

Там есть prod() в numpy это делает то, о чем вы просите.

Numeric.product 

( или

reduce(lambda x,y:x*y,[3,4,5])

)

Используй это

def prod(iterable):
    p = 1
    for n in iterable:
        p *= n
    return p

Поскольку нет встроенного prod функция.

Я предпочитаю ответы a и b выше использовалось функции.уменьшить() и тот ответ используя numpy.prod() numpy.prod(), но вот еще одно решение , использующее itertools.аккумулировать():

import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]

Возможно, не "встроенный", но я считаю его встроенным.в любом случае, просто используйте numpy

import numpy 
prod_sum = numpy.prod(some_list)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top