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.

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top