Python's sum() function returns the sum of numbers in an iterable.
sum([3,4,5]) == 3 + 4 + 5 == 12
I'm looking for the function that returns the product instead.
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
10 Answers 10
Historically, Guido vetoed the idea: http://bugs.python.org/issue1093
As noted in that issue, you can make your own:
from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator
reduce(operator.mul, (3, 4, 5), 1)
9 Comments
reduce?product() in the standard library, the number of views on this question may help make the case.In Python 3.8, the prod function was added to the math module. See: math.prod().
Older info: Python 3.7 and prior
The function you're looking for would be called prod() or product() but Python doesn't have that function. So, you need to write your own (which is easy).
Pronouncement on prod()
Yes, that's right. Guido rejected the idea for a built-in prod() function because he thought it was rarely needed.
Alternative with reduce()
As you suggested, it is not hard to make your own using reduce() and operator.mul():
from functools import reduce # Required in Python 3
import operator
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
Note, in Python 3, the reduce() function was moved to the functools module.
Specific case: Factorials
As a side note, the primary motivating use case for prod() is to compute factorials. We already have support for that in the math module:
>>> import math
>>> math.factorial(10)
3628800
Alternative with logarithms
If your data consists of floats, you can compute a product using sum() with exponents and logarithms:
>>> 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
Note, the use of log() requires that all the inputs are positive.
2 Comments
There's a prod() in numpy that does what you're asking for.
4 Comments
np.prod(range(1,13)) gives the correct answer equal to 12! but np.prod(range(1,14)) does not.np.prod(arange(1,14, dtype='object'))?math.prod() function will make this answer obsolete.There isn't one built in, but it's simple to roll your own, as demonstrated here:
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
See answers to this question:
Which Python module is suitable for data manipulation in a list?
8 Comments
functools.reduce instead of reduce.prod = functools.partial(functools.reduce, operator.mul)Numeric.product
( or
reduce(lambda x,y:x*y,[3,4,5])
)
5 Comments
Use this
def prod(iterable):
p = 1
for n in iterable:
p *= n
return p
Since there's no built-in prod function.
5 Comments
lambda a,b: a*b, it isn't a problem. But reduce doesn't generalize well, and gets abused. I prefer beginners not learn it.reduce-based solutionPerhaps not a "builtin", but I consider it builtin. anyways just use numpy
import numpy
prod_sum = numpy.prod(some_list)
1 Comment
I prefer the answers a and b above using functools.reduce() and the answer using numpy.prod(), but here is yet another solution using itertools.accumulate():
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]
Comments
You can also encode your list of numbers as a pd.Series and then use pd.Series.product():
>>> import pandas as pd
>>> pd.Series([5,3,-1]).product()
-15
Comments
If you don't want to import anything:
eval("*".join([str(num) for num in list_of_numbers]))