给定一个像[1,2,3,4,5,6]这样的数字列表,我如何编写代码将它们相乘,即计算1*2*3*4*5*6?


当前回答

Python 3:使用functools.reduce:

>>> from functools import reduce
>>> reduce(lambda x, y: x*y, [1, 2, 3, 4, 5, 6])
720

Python 2:使用reduce:

>>> reduce(lambda x, y: x*y, [1, 2, 3, 4, 5, 6])
720

为了兼容2和3,请使用Six (pip install Six),然后:

>>> from six.moves import reduce
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720

其他回答

在Python 3.8及以上版本中,数学标准库模块为此提供了.prod:

数学。Prod(可迭代,*,start=1)

该方法返回起始值(默认值:1)乘以数字可迭代对象的乘积:

import math
math.prod([1, 2, 3, 4, 5, 6])
# 720

如果可迭代对象为空,将产生1(或者起始值,如果提供)。

一种使用方法是math.prod() 例如:

import math
arr = [1, 2, 3, 4]
print(math.prod(arr))

另一种方法是numpy.prod() 这是另一个要导入的库

import numpy
arr = [1, 2, 3, 4]
print(numpy.prod(arr))
nums = str(tuple([1,2,3]))
mul_nums = nums.replace(',','*')
print(eval(mul_nums))

在这个帖子里有很多很好的答案。如果您想在实际生产中进行列表相乘,我建议使用标准numpy或math包。

如果你只是在寻找一个快速而肮脏的解决方案,你不想导入任何东西,你可以这样做:

l = [1,2,3,4,5,6]

def list_multiply(l):
    return eval('*'.join(map(str,l)))
    
print(list_multiply(l))
#Output: 720

Map (str,l)将列表中的每个元素转换为字符串。Join将每个元素组合成一个由*符号分隔的字符串。Eval将字符串转换回可以求值的函数。

警告:使用eval被认为是危险的,特别是当程序接受用户输入时,因为用户可能会向代码中注入任何函数并危及您的系统。

如果你想避免导入任何东西,避免Python中更复杂的部分,你可以使用一个简单的for循环:

nums = [1, 2, 3]

product = 1  # Don't use 0 here, otherwise, you'll get zero 
             # because anything times zero will be zero.
for num in nums:
    product *= num