¿Hay un product() incorporado en Python? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

He estado mirando un tutorial y un libro, pero no puedo encontrar ninguna mención de una función de producto incorporada, es decir, del mismo tipo que sum (), pero no pude encontrar nada como prod().

Es la única manera que podría encuentra el producto de los artículos en una lista importando el operador mul()?

Author: Bill the Lizard, 2011-10-31

4 answers

Pronunciamiento

Sí, así es. Guido rechazó la idea de una función prod() incorporada porque pensó que rara vez era necesaria.

Alternativa con reduce ()

Como usted sugirió, no es difícil hacer su propio uso reducir() y operadora.mul():

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

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

En Python 3, el reducir() la función se movió al módulo functools , por lo que necesitaría añadir:

from functools import reduce

Caso específico: Factoriales

Como nota al margen, el principal caso de uso motivador para prod() es calcular factoriales. Ya tenemos soporte para eso en el módulo math :

>>> import math

>>> math.factorial(10)
3628800

Alternativa con logaritmos

Si sus datos consisten en flotadores, puede calcular un producto usando 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
 81
Author: Raymond Hettinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-06 17:27:31

No hay product en Python, pero puedes definirlo como

def product(iterable):
    return reduce(operator.mul, iterable, 1)

O, si tiene NumPy, use numpy.product.

 18
Author: Fred Foo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-30 22:26:26

Dado que la función reduce() ha sido eliminada en python 3.0, debes tomar un enfoque diferente.

Puedes usar functools.reduce() para hacer que el cambio no ocurra:

product = functools.reduce(operator.mul, iterable, 1)

O, si quieres seguir el espíritu del equipo python (que eliminó reduce() porque piensan que for sería más legible), hazlo con un bucle:

product = 1
for x in iterable:
    product *= x
 11
Author: Paul Paulsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-05 21:03:36
from numpy import multiply, product
list1 = [2,2,2]
list2 = [2,2,2]
mult = 3
prod_of_lists = multiply(list1,list2)
>>>[4,4,4]
prod_of_list_by_mult = multiply(list1,mult)
>>>[6,6,6]
prod_of_single_array = product(list1)
>>>8

Numpy tiene muchas funciones muy interesantes para las listas!

 7
Author: HuntR2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-30 22:27:17