web-dev-qa-db-fra.com

Quelle est la fonction comme sum () mais pour la multiplication? produit()?

La fonction sum() de Python renvoie la somme des nombres dans un itératif.

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

Je cherche la fonction qui renvoie le produit à la place.

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

Je suis à peu près sûr qu'une telle fonction existe, mais je ne la trouve pas.

155
Patrick McElhaney

En fait, Guido a opposé son veto à l'idée: http://bugs.python.org/issue1093

Mais, comme indiqué dans ce numéro, vous pouvez en créer 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)
189
ojrac

Il n’en existe pas, mais il est simple de lancer le vôtre, comme le montre la démonstration ici :

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

Voir les réponses à cette question: 

Quel module Python convient à la manipulation de données dans une liste?

39
zweiterlinde

Il y a un prod() numpy qui fait ce que vous demandez.

31
Benjamin

Mettre à jour:

Dans Python 3.8, la fonction prod a été ajoutée au module math. Voir: math.prod () .

Info plus ancienne: Python 3.7 et versions antérieures

La fonction que vous recherchez s'appellerait prod () ou product () mais Python ne dispose pas de cette fonction. Donc, vous devez écrire le vôtre (ce qui est facile).

Prononce sur prod ()

Oui c'est vrai. Guido a rejeté l'idée } pour une fonction prod () intégrée car il pensait que c'était rarement nécessaire.

Alternative avec réduction ()

Comme vous l'avez suggéré, il n'est pas difficile de créer le vôtre avec 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, la fonction réduction () a été déplacée vers le module functools , vous devez donc ajouter:

from functools import reduce

Cas spécifique: Factoriels

En remarque, le principal cas d'utilisation motivant de prod () consiste à calculer des factoriels. Nous avons déjà un support pour cela dans le module mathématique :

>>> import math

>>> math.factorial(10)
3628800

Alternative aux logarithmes

Si vos données sont constituées de flottants, vous pouvez calculer un produit en utilisant sum () avec des exposants et des 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

Notez que l'utilisation de log () nécessite que toutes les entrées soient positives.

30
Raymond Hettinger
Numeric.product 

( ou 

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

)

22
Steve B.

Utilisez ceci

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

Puisqu'il n'y a pas de fonction prod intégrée.

16
S.Lott

Je préfère les réponses a et b en utilisant functools.reduce () et le answer en utilisant numpy.prod () , mais voici une autre solution using itertools.accumulate () :

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

Peut-être pas un "intégré", mais je le considère comme intégré. de toute façon il suffit d'utiliser numpy

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