Какова функция sum (), но для умножения? продукт()?

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

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

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

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

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

7 ответов


резюме

функции вы ищете назвали бы prod () или product () но Python не имеет этой функции. Итак, вам нужно написать свой собственный (это легко).

произнесение на prod ()

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

альтернатива с уменьшением ()

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

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

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

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

from functools import reduce

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

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

>>> import math

>>> math.factorial(10)
3628800

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

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

>>> 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

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)

там нет одного встроенного, но это просто свернуть свой собственный, как показано здесь:

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

Так как нет встроенного


Я предпочитаю ответы a и b, С помощью functools.reduce () и ответ используя и NumPy.prod (), но вот еще одно решение с использованием itertools.accumulate ():

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