如何编写代码将给定的数字列表相乘,例如 [1,2,3,4,5,6]
,计算结果应为1*2*3*4*5*6
?
如何编写代码将给定的数字列表相乘,例如 [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
您可以使用:
import operator
import functools
functools.reduce(operator.mul, [1,2,3,4,5,6], 1)
有关说明,请参阅reduce
和operator.mul
文档。
在Python 3+中,您需要加入import functools
模块。
reduce()
函数已从全局命名空间中移除,并放置在functools
模块中。因此,在Python3中,您需要使用语句 from functools import reduce
。 - Eugene Yarmash我将使用numpy.prod
来执行任务:
import numpy as np
mylist = [1, 2, 3, 4, 5, 6]
result = np.prod(np.array(mylist))
result = np.prod(mylist)
。 - Nicknumpy.int32
,可能会发生溢出
2) 对于较小的列表,这将明显变慢,因为NumPy需要分配一个数组(如果经常重复使用,则相关) - Disenchantednp.prod(np.array(range(1,21)))
。 - PatrickTreduce
。 - Peyman如果您想避免导入任何内容并避免使用更复杂的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
import math
math.prod([1, 2, 3, 4, 5, 6])
# 720
以下是我机器的一些性能测量结果。如果在长时间运行的循环中处理小输入,则这些结果可能会有帮助:
import functools, operator, timeit
import numpy as np
def multiply_numpy(iterable):
return np.prod(np.array(iterable))
def multiply_functools(iterable):
return functools.reduce(operator.mul, iterable)
def multiply_manual(iterable):
prod = 1
for x in iterable:
prod *= x
return prod
sizesToTest = [5, 10, 100, 1000, 10000, 100000]
for size in sizesToTest:
data = [1] * size
timerNumpy = timeit.Timer(lambda: multiply_numpy(data))
timerFunctools = timeit.Timer(lambda: multiply_functools(data))
timerManual = timeit.Timer(lambda: multiply_manual(data))
repeats = int(5e6 / size)
resultNumpy = timerNumpy.timeit(repeats)
resultFunctools = timerFunctools.timeit(repeats)
resultManual = timerManual.timeit(repeats)
print(f'Input size: {size:>7d} Repeats: {repeats:>8d} Numpy: {resultNumpy:.3f}, Functools: {resultFunctools:.3f}, Manual: {resultManual:.3f}')
结果:
Input size: 5 Repeats: 1000000 Numpy: 4.670, Functools: 0.586, Manual: 0.459
Input size: 10 Repeats: 500000 Numpy: 2.443, Functools: 0.401, Manual: 0.321
Input size: 100 Repeats: 50000 Numpy: 0.505, Functools: 0.220, Manual: 0.197
Input size: 1000 Repeats: 5000 Numpy: 0.303, Functools: 0.207, Manual: 0.185
Input size: 10000 Repeats: 500 Numpy: 0.265, Functools: 0.194, Manual: 0.187
Input size: 100000 Repeats: 50 Numpy: 0.266, Functools: 0.198, Manual: 0.185
你可以看到,对于较小的输入,Numpy要慢得多,因为它在执行乘法之前需要分配一个数组。此外,请注意Numpy中的溢出问题。multiply_functools
和 multiply_numpy
受到了查找 np
、functools
和 operator
全局变量以及属性查找的影响。您是否介意切换到本地变量?在函数签名中添加 _reduce=functools.reduce,
_mul=operator.mul,然后在函数体中返回
_reduce(_mul, iterable)` 等。 - Martijn PietersNumpy
提供了prod()
函数,用于返回列表或数组(在这里是Numpy数组)的给定轴上的乘积:
import numpy
a = [1,2,3,4,5,6]
b = numpy.prod(a)
...或者您可以直接导入numpy.prod()
:
from numpy import prod
a = [1,2,3,4,5,6]
b = prod(a)
个人认为,以下代码可用于将所有通用列表元素相乘的函数:
def multiply(n):
total = 1
for i in range(0, len(n)):
total *= n[i]
print total
这段代码很简洁,只用了一个变量和一个for循环,对我来说感觉很直观(它看起来就像我想到这个问题的方式一样:取一个数,乘以它,然后再乘以下一个数,以此类推!)
for i in n:
,然后 total *= i
呢?这样不是更简单吗? - Munim Munnaimport numpy as np
np.exp(np.log(your_array).sum())
np.prod(your_Array)
即可。 - dashesynums = str(tuple([1,2,3]))
mul_nums = nums.replace(',','*')
print(eval(mul_nums))
*
,以便 eval 将其识别为乘法。我想知道这样的性能如何,特别是与其他解决方案相比较。 - dennlingereval
(或exec
)。这是一个严重的安全风险。您允许数据的作者在您的计算机上运行任意代码。它不能轻松地被沙盒化,而适当的沙盒化比使用适当的工具更难。 - Karl Knechtel
lambda
函数平均每1000次操作需要0.02秒,而使用operator.mul
函数平均每1000次操作需要0.009秒,因此operator.mul
的速度比lambda
函数快一个数量级。 - whereswaldenoperator.mul
可以直接进入C。 - whereswaldenmath.prod([1,2,3,4,5,6])
来简单完成。 (当然需要导入math模块) - Tomerikoosix
,即可在 Python 2.6 或 2.7 中使用与 Python 3 相同的语法。您只需要使用与 Python 3 中相同的行from functools import reduce
即可。 - Alan