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


206

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

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

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

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

そのような関数が存在することは確かですが、見つかりません。

回答:


71

更新:

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

以前の情報:Python 3.7以前

探している関数はprod()またはproduct()と呼ばれますが、Pythonにはその関数がありません。だから、あなたは自分で書く必要があります(簡単です)。

prod()の発音

はい、そうです。Guido は、組み込みのprod()関数の必要性はほとんどないと考えたため、そのアイデア拒否しました。

reduce()による代替

あなたが示唆したように、reduce()operator.mul()を使用して独自に作成することは難しくありません:

from functools import reduce  # Required in Python 3
def prod(iterable):
    return reduce(operator.mul, iterable, 1)

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

Python 3では、reduce()関数はfunctoolsモジュールに移動されました。

特定のケース:階乗

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


最後の例のフロートは正である必要があることを追加したいかもしれません。それ以外の場合は、cmathを使用する必要がありますが、それでも実際にはすべてのケースで機能しません。
Veky

212

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

4
以下は、Guidoを引用するための「これが必要」の良い例です:product(filter(None、[1,2,3、None]))。うまくいけば、いつか含まれるでしょう。
the911s 2014年

13
グイドは嫌いな人でもないreduceですか?
クリスマーティン

3
そうです、reduceはPython 3のビルトインでさえありません。IMO、標準(またはサードパーティ)ライブラリがそうするときに、すべての可能なリスト演算子をグローバルビルトインに追加する必要はありません。ビルトインが多くなるほど、ローカル変数名として一般的な単語が使用禁止になります。
ojrac

7
このナゲットが、redo()に関するGuidoのブログ投稿で見つかりました。「すでにsum();があるので、楽にreduce()をproduct()に交換したいと思います...」。だれかがproduct()標準ライブラリに含めることを請願したい場合は、この質問に対する意見の数が訴訟を起こすのに役立つかもしれません。
Patrick McElhaney、2016

1
@PatrickMcElhaney python3はすでにreduce組み込みを取り除いているようです。製品はチャンスを逃したと思います。;)
ojrac

41

組み込みのものはありませんが、ここで示すように、自分でロールするのは簡単です

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

この質問への回答を見る:

リスト内のデータ操作に適したPythonモジュールはどれですか?


8
Python 3を使用している場合は、のfunctools.reduce代わりにを使用してくださいreduce
Steven Rumbalski、2015年

1
functoolsをさらに楽しむには:prod = functools.partial(functools.reduce, operator.mul)
bukzor 2018

39

ありますprod()、あなたが求めているものを行いnumpyの中で。


3
注:Pythonのlong(任意の精度の整数)はサポートされていないためnp.prod(range(1,13))、正解は12になります。しかしnp.prod(range(1,14))しません。
Jason S

2
@JasonS np.prod(arange(1,14, dtype='object'))
内部石2016

1
math.prod()この関数は、この答えは陳腐化します。
ブノワP

単純なワンライナーでこれを実行したい場合、数学をインポートする必要があるのはまだ退屈です。reduce()とGuido-rejected product()がありません。
RCross

25
Numeric.product 

(または

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


彼は、自分で関数を作成するのではなく、モジュールまたはライブラリからロードできる関数を望んでいます。
ジェレミーL

2
しかし、それがない場合でも、彼はおそらく機能を望んでいます。
DNS、

1
そうですが、彼が主な質問であるため、存在しないことを知る必要があります。
ジェレミーL

2
また、デフォルト値の1を小さくする必要があります。そうしないと、nullの場合に失敗します。空のシーケンスの積は1として定義される
アーロンロブソン

3
@CraigMcQueen Numericは、numpyの前身(の1つ)です。
tacaswell 2015年

22

これを使って

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

ビルトインがないので prod関数が。


6
削減は本当にアンチパターンであると考える必要があります:)
zweiterlinde

1
彼は、使用できる既存の関数が存在するかどうかを知りたいと考えました。
ジェレミーL

そしてこの答えは、それがないことを説明しています。
EBGreen、2009

5
@zweiterlinde:初心者の場合、問題の原因となるリードを減らします。この場合、を使用lambda a,b: a*bしても問題ありません。しかし、reduceは一般化されず、乱用されます。初心者は覚えない方がいいです。
S.Lott、2009

@ S.Lott初心者がreduceを使用するのを見たことはありません。いや、「中級」のプログラマでさえ、通常、リストの理解以上のことはあまり知りません。
Mateen Ulhaq 2018年


2

おそらく「組み込み」ではないかもしれませんが、組み込みだと考えています。とにかくnumpyを使うだけ

import numpy 
prod_sum = numpy.prod(some_list)

それは「私のマシンで動作する」というステートメントに危険なほど近いものです。Numpyは素敵ですが、組み込みではありません
RCross
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.