如何使用 Python 将列表中的所有项目相乘?[重复]
- 2025-02-25 09:07:00
- admin 原创
- 21
问题描述:
给定一个数字列表,例如[1,2,3,4,5,6]
,我该如何编写代码将它们全部相乘,即计算1*2*3*4*5*6
?
解决方案 1:
Python 3.8+:使用math.prod
:
>>> import math
>>> math.prod([1, 2, 3, 4, 5, 6])
720
Python <= 3.7:使用functools.reduce
:
>>> from functools import reduce
>>> reduce(lambda x, y: x*y, [1, 2, 3, 4, 5, 6], 1)
720
解决方案 2:
您可以使用:
import operator
import functools
functools.reduce(operator.mul, [1,2,3,4,5,6], 1)
请参阅reduce
和operator.mul
文档以获得解释。
您需要import functools
Python 3+ 中的该行。
解决方案 3:
我将使用numpy.prod
来执行任务:
import numpy as np
mylist = [1, 2, 3, 4, 5, 6]
result = np.prod(np.array(mylist))
解决方案 4:
如果您想避免导入任何内容并避免使用更复杂的 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
解决方案 5:
在Python 3.8及更高版本中,math
标准库模块提供了.prod
此目的:
math.prod(iterable, *, start=1)
该方法返回一个值(默认值:1)乘以一个可迭代数字的乘积start
:
import math
math.prod([1, 2, 3, 4, 5, 6])
# 720
如果可迭代对象为空,则会产生1
(或start
产生值,如果提供的话)。
解决方案 6:
以下是我的机器的一些性能测量结果。如果在长时间运行的循环中针对小输入执行此操作,则相关:
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 中的溢出。
解决方案 7:
Numpy
具有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)
解决方案 8:
我个人喜欢这个将通用列表的所有元素相乘的函数:
def multiply(n):
total = 1
for i in range(0, len(n)):
total *= n[i]
print total
它紧凑,使用简单的东西(一个变量和一个 for 循环),并且对我来说感觉很直观(它看起来就像我思考问题的方式,只需取一个,乘以它,然后乘以下一个,依此类推!)
解决方案 9:
简单的方法是:
import numpy as np
np.exp(np.log(your_array).sum())
解决方案 10:
nums = str(tuple([1,2,3]))
mul_nums = nums.replace(',','*')
print(eval(mul_nums))
解决方案 11:
只想添加一个 Python 3.8 单行答案:
def multiply(l):
return [b := 1, [b := b * a for a in l]][-1][-1]
print(multiply([2, 3, 8, 10]))
输出:
480
解释:
[b := 1,
用于定义临时变量...[b := b * a for a in l]
用于遍历列表并乘以b
每个元素...[-1][-1]
是因为最后的列表是[b, [b * l[0], b * l[1], ..., b * l[-1]]]
。所以最后位置的元素是列表中所有元素的乘积。
解决方案 12:
None
今天发现了这个问题,但我注意到它没有列表中有的情况。因此,完整的解决方案是:
from functools import reduce
a = [None, 1, 2, 3, None, 4]
print(reduce(lambda x, y: (x if x else 1) * (y if y else 1), a))
对于加法,我们有:
print(reduce(lambda x, y: (x if x else 0) + (y if y else 0), a))
解决方案 13:
那么使用递归怎么样?
def multiply(lst):
if len(lst) > 1:
return multiply(lst[:-1])* lst[-1]
else:
return lst[0]
解决方案 14:
您可以使用的一种方法是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))