web-dev-qa-db-ja.com

sum()のような関数ですが、乗算は何ですか?製品()?

Pythonの sum() 関数は、イテラブルの数値の合計を返します。

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

代わりに製品を返す関数を探しています。

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

私はそのような関数が存在することを確信していますが、それを見つけることができません。

170

実際、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)
201
ojrac

更新:

Python 3.8では、prod関数がmathモジュールに追加されました。 math.prod() を参照してください。

古い情報:Python 3.7以前

探している関数はprod()またはproduct()と呼ばれますが、Pythonは呼び出されませんその機能はありません。そのため、独自のコードを作成する必要があります(簡単です)。

Prod()の発音

はい、そうです。 Guido アイデアを拒否 組み込みprod()関数の場合、彼はそれがめったに必要ではないと考えたため。

Reduce()の代替

あなたが提案したように、 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()を使用するには、すべての入力が正である必要があることに注意してください。

41

組み込みのものはありませんが、 here

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

この質問への回答をご覧ください。

どのPythonモジュールがリスト内のデータ操作に適していますか?

40
zweiterlinde

Numpyには prod() があり、あなたが求めていることを行います。

35
Benjamin
Numeric.product 

( または

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

22
Steve B.

これを使って

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

組み込みのprod関数がないため。

16
S.Lott

functools.reduce() を使用して上記の回答 a および b を選択し、 answer を使用して numpy.prod() ですが、 itertools.accumulate() を使用した別のソリューションがあります:

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

おそらく「ビルトイン」ではありませんが、ビルトインだと思います。とにかくnumpyを使うだけ

import numpy 
prod_sum = numpy.prod(some_list)
1
katiex7