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.

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top