Python的sum()
函数返回迭代中的数字总和。
sum([3,4,5]) == 3 + 4 + 5 == 12
我正在寻找返回产品的功能。
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
我很确定这样的功能存在,但我找不到它。
答案 0 :(得分:200)
实际上,Guido否决了这个想法: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)
答案 1 :(得分:40)
没有内置的内容,但展示自己的内容很简单,如here所示:
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
查看这个问题的答案:
Which Python module is suitable for data manipulation in a list?
答案 2 :(得分:36)
在Python 3.8中, prod 函数已添加到 math 模块中。请参阅:math.prod()。
您正在寻找的功能将被称为 prod()或 product(),但Python没有该功能。所以,你需要自己编写(这很容易)。
是的,没错。 Guido rejected the idea用于内置prod()函数,因为他认为很少需要它。
根据您的建议,使用reduce()和operator.mul()制作自己并不难:
from functools import reduce
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
在Python 3中,reduce()函数已移至functools module,因此您需要添加:
from functools import reduce
作为旁注, prod()的主要激励用例是计算阶乘。我们已经在math module:
中为此提供了支持>>> 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
注意,使用 log()要求所有输入都是正数。
答案 3 :(得分:35)
numpy中有一个prod()
可以满足您的要求。
答案 4 :(得分:22)
Numeric.product
(或
reduce(lambda x,y:x*y,[3,4,5])
)
答案 5 :(得分:16)
使用此
def prod(iterable):
p = 1
for n in iterable:
p *= n
return p
由于没有内置prod
功能。
答案 6 :(得分:2)
我更喜欢上面的答案a和b使用functools.reduce()而answer使用numpy.prod(),但这是使用itertools.accumulate()的另一种解决方案}:
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]
答案 7 :(得分:1)
也许不是“内置”,但我认为它是内置的。无论如何,只要使用numpy
import numpy
prod_sum = numpy.prod(some_list)