Pythonの sum()
関数は、イテラブルの数値の合計を返します。
sum([3,4,5]) == 3 + 4 + 5 == 12
代わりに製品を返す関数を探しています。
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
私はそのような関数が存在することを確信していますが、それを見つけることができません。
実際、Guidoはアイデアを拒否しました: http://bugs.python.org/issue109
しかし、その問題で述べたように、かなり簡単に作成できます。
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では、prod関数がmathモジュールに追加されました。 math.prod() を参照してください。
探している関数はprod()またはproduct()と呼ばれますが、Pythonは呼び出されませんその機能はありません。そのため、独自のコードを作成する必要があります(簡単です)。
はい、そうです。 Guido アイデアを拒否 組み込み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モジュール に移動されたため、追加する必要があります:
from functools import reduce
補足として、prod()の主な動機付けの使用例は、階乗を計算することです。 mathモジュール で既にサポートしています。
>>> 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()を使用するには、すべての入力が正である必要があることに注意してください。
組み込みのものはありませんが、 here :
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
この質問への回答をご覧ください。
Numpyには prod()
があり、あなたが求めていることを行います。
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
関数がないため。
functools.reduce() を使用して上記の回答 a および b を選択し、 answer を使用して numpy.prod() ですが、 itertools.accumulate() を使用した別のソリューションがあります:
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]
おそらく「ビルトイン」ではありませんが、ビルトインだと思います。とにかくnumpyを使うだけ
import numpy
prod_sum = numpy.prod(some_list)