Pregunta

pitón sum() La función devuelve la suma de números en un iterable.

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

Estoy buscando la función que devuelve el producto.

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

Estoy bastante seguro de que existe esa función, pero no puedo encontrarla.

¿Fue útil?

Solución

En realidad, Guido vetado la idea: http://bugs.python.org/issue1093

Sin embargo, como se señaló en ese problema, puede hacer uno con bastante facilidad:

from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator

reduce(operator.mul, (3, 4, 5), 1)

Otros consejos

Actualización:

En Python 3.8, el prod función se añadió a la math módulo. Ver:. math.prod ()

Información de Mayores: Python 3.7 y anteriores

La función que está buscando se llama prod () o producto () pero Python no tiene esa función. Por lo tanto, es necesario escribir su propio (que es fácil).

pronunciamiento sobre prod ()

Sí, eso es correcto. Guido rechazaron la idea para una función incorporada de prod () porque pensaba que rara vez se necesitaba.

Alternativa con reducir ()

Como se ha sugerido, no es difícil de hacer un juego usando reducir () y href="https://docs.python.org/3/library/operator.html#operator.mul" rel="noreferrer"> operador. mul () :

from functools import reduce
def prod(iterable):
    return reduce(operator.mul, iterable, 1)

>>> prod(range(1, 5))
24

En Python 3, la Reducir () función se trasladó a la functools módulo , por lo que necesitaría añadir:

from functools import reduce

Caso específico: factoriales

Como nota al margen, la principal motivación para los casos de uso prod () es calcular factoriales. Ya tenemos el apoyo para que en el módulo matemático :

>>> import math

>>> math.factorial(10)
3628800

Alternativa con logaritmos

Si los datos se compone de los flotadores, se puede calcular un producto utilizando sum () con exponentes y logaritmos:

>>> 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

Tenga en cuenta, el uso de log () requiere que todas las entradas son positivos.

No hay uno incorporado, pero es fácil de rodar su propia, como se demuestra aquí :

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

Ver las respuestas a esta pregunta:

Qué módulo Python es adecuado para los datos la manipulación en una lista?

Hay una prod() en numpy que hace lo que está pidiendo.

Numeric.product 

(o

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

)

Utilizar esta

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

Como no hay incorporado prod función.

Yo prefiero las respuestas un y b anteriormente usando functools.reduce () y la responder usando numpy.prod () , pero aquí es otra solución utilizando itertools.accumulate () :

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

Tal vez no sea un "incorporado", pero considero que es incorporado. de todos modos sólo tiene que utilizar numpy

import numpy 
prod_sum = numpy.prod(some_list)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top