Quelle est la fonction comme somme () mais pour la multiplication? produit()?
Question
La fonction de python sum()
renvoie la somme des nombres dans un iterable.
sum([3,4,5]) == 3 + 4 + 5 == 12
Je cherche la fonction qui retourne à la place du produit.
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
Je suis assez sûr une telle fonction existe, mais je ne peux pas le trouver.
La solution
En fait, Guido a opposé son veto à l'idée: http://bugs.python.org/issue1093
Mais, comme il est indiqué dans cette question, vous pouvez faire un assez facilement:
from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator
reduce(operator.mul, (3, 4, 5), 1)
Autres conseils
Mise à jour:
En Python 3.8, l'au mathématiques module de fonction prod a été ajouté. Voir:. math.prod ()
Infos ancien: Python 3.7 et avant
La fonction que vous recherchez serait appelé prod () ou produit () mais Python n'a pas cette fonction. , Vous avez besoin d'écrire votre propre (ce qui est facile).
prod prononcer sur ()
Oui, c'est vrai. Guido a rejeté l'idée pour une fonction intégrée prod () parce qu'il pensait qu'il était rarement nécessaire.
Alternative à réduire ()
Comme vous l'avez dit, il est difficile de ne pas faire votre propre en utilisant réduire () et opérateur. mul () :
from functools import reduce
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
En Python 3, réduire () fonction a été déplacé vers le Module functools , donc vous auriez besoin d'ajouter:
from functools import reduce
Cas particulier: factorielles
Comme une note de côté, la principale utilisation de motivation pour prod () est de calculer factorielles. Nous avons déjà le soutien pour que le module math :
>>> import math
>>> math.factorial(10)
3628800
Alternative avec logarithmes
Si vos données se compose de flotteurs, vous pouvez calculer un produit en utilisant somme () avec des exposants et logarithmes:
>>> 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, l'utilisation de log () exige que toutes les entrées sont positives.
Il n'y a pas un construit, mais il est facile de rouler vos propres, comme le montre ici :
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
Voir les réponses à cette question:
Quel module Python est adapté pour les données la manipulation dans une liste
Il y a un prod()
numpy qui fait ce vous demandez.
Numeric.product
(ou
reduce(lambda x,y:x*y,[3,4,5])
)
Utilisez cette
def prod(iterable):
p = 1
for n in iterable:
p *= n
return p
Comme il n'y a pas de fonction prod
intégrée.
Je préfère les réponses et b ci-dessus en utilisant functools.reduce () et répondre en utilisant numpy.prod () , mais voici une autre solution en utilisant itertools.accumulate () :
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]
Peut-être pas un « builtin », mais je considère qu'il est intégré. de toute façon utiliser juste numpy
import numpy
prod_sum = numpy.prod(some_list)