Qual è la funzione come somma (), ma per la moltiplicazione?prodotto()?
Domanda
Python sum()
la funzione restituisce la somma dei numeri in un iterable.
sum([3,4,5]) == 3 + 4 + 5 == 12
Sto cercando la funzione che restituisce il prodotto invece.
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
Sono abbastanza sicuro che una tale funzione esiste, ma io non riesco a trovarlo.
Soluzione
In realtà, Guido posto il veto l'idea: http://bugs.python.org/issue1093
Ma, come notato in quel numero, è possibile effettuare uno abbastanza facilmente:
from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator
reduce(operator.mul, (3, 4, 5), 1)
Altri suggerimenti
Aggiornamento:
In Python 3.8, il prod funzione è stata aggiunta al modulo math . Vedi:. math.prod ()
più vecchio Info: Python 3.7 e precedenti
La funzione che stai cercando sarebbe chiamato prod () o prodotto () , ma Python non ha questa funzione. Quindi, è necessario scrivere il proprio (che è facile).
pronunciarsi sulla prod ()
Sì, è vero. Guido respinto l' idea per una funzione built-in prod () perché pensava di rado era necessario.
alternativa con ridurre ()
Come lei ha suggerito, non è difficile fare il proprio utilizzando ridurre () e href="https://docs.python.org/3/library/operator.html#operator.mul" rel="noreferrer"> operatore. mul () :
from functools import reduce
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
In Python 3, il ridurre () funzione è stata spostata nella functools modulo , quindi si avrebbe bisogno per aggiungere:
from functools import reduce
Caso specifico: fattoriali
Come nota laterale, il caso d'uso motivante per prod () è calcolare fattoriali. Abbiamo già il supporto per che nel modulo matematico :
>>> import math
>>> math.factorial(10)
3628800
alternativa con i logaritmi
Se i dati è costituito da galleggianti, si può calcolare un prodotto utilizzando sum () con esponenti e logaritmi:
>>> 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
Nota, l'uso di log () richiede che tutti gli ingressi sono positivi.
Non è uno integrato, ma è semplice da rotolare il proprio, come dimostrato qui :
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
Vedere le risposte a questa domanda:
Quale modulo Python è adatto per i dati manipolazione in un elenco?
C'è un prod()
in NumPy che fa quello stai chiedendo.
Numeric.product
(o
reduce(lambda x,y:x*y,[3,4,5])
)
Utilizzare questo
def prod(iterable):
p = 1
for n in iterable:
p *= n
return p
Poiché non c'è alcun built-in prod
funzione.
Io preferisco le risposte un e b sopra utilizzando functools.reduce () e rispondere utilizzando numpy.prod () , ma qui è un'altra soluzione utilizzando itertools.accumulate () :
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]
Forse non un "integrato", ma ritengo che sia incorporato. comunque basta usare NumPy
import numpy
prod_sum = numpy.prod(some_list)