use*_*814 183 python list multiplication
我需要编写一个函数,它接受一个数字列表并将它们相乘.例子:
[1,2,3,4,5,6]会给我1*2*3*4*5*6.我真的可以使用你的帮助.
ric*_*ier 191
Python 3:使用functools.reduce:
>>> from functools import reduce
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720
Run Code Online (Sandbox Code Playgroud)
Python 2:使用reduce:
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720
Run Code Online (Sandbox Code Playgroud)
为了兼容2和3使用pip install six,那么:
>>> from six.moves import reduce
>>> reduce(lambda x, y: x*y, [1,2,3,4,5,6])
720
Run Code Online (Sandbox Code Playgroud)
ice*_*ime 163
您可以使用:
import operator
import functools
functools.reduce(operator.mul, [1,2,3,4,5,6], 1)
Run Code Online (Sandbox Code Playgroud)
请参阅reduce和operator.mul文档以获得解释.
你需要import functoolsPython 3+中的这一行.
bel*_*nju 70
我会用它numpy.prod来执行任务.见下文.
import numpy as np
mylist = [1, 2, 3, 4, 5, 6]
result = np.prod(np.array(mylist))
Run Code Online (Sandbox Code Playgroud)
Dea*_*hex 54
如果您想避免导入任何内容并避免使用更复杂的Python区域,可以使用简单的for循环
product = 1 # Don't use 0 here, otherwise, you'll get zero
# because anything times zero will be zero.
list = [1, 2, 3]
for x in list:
product *= x
Run Code Online (Sandbox Code Playgroud)
小智 8
我个人喜欢这个函数,它将通用列表的所有元素相乘:
def multiply(n):
total = 1
for i in range(0, len(n)):
total *= n[i]
print total
Run Code Online (Sandbox Code Playgroud)
它很紧凑,使用简单的东西(一个变量和一个for循环),对我来说很直观(看起来我怎么想到这个问题,只需取一个,乘以它,再乘以下一个,依此类推! )
这是我的机器的一些性能测量.在长时间运行的循环中对小输入执行此操作时相关:
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}')
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)
您可以看到Numpy在较小的输入上相当慢,因为它在执行乘法之前分配了一个数组.另外,请注意Numpy的溢出情况.
小智 8
Numpy具有prod()返回列表乘积的函数,或者在本例中,因为它是 numpy,所以它是给定轴上数组的乘积:
import numpy
a = [1,2,3,4,5,6]
b = numpy.prod(a)
Run Code Online (Sandbox Code Playgroud)
...否则你可以导入numpy.prod():
from numpy import prod
a = [1,2,3,4,5,6]
b = prod(a)
Run Code Online (Sandbox Code Playgroud)
从开始Python 3.8,.prod函数已包含math在标准库的模块中:
math.prod(iterable, *, start=1)
该方法返回一个start值(默认值:1)乘以一个可迭代数字的乘积:
import math
math.prod([1, 2, 3, 4, 5, 6])
>>> 720
Run Code Online (Sandbox Code Playgroud)
如果iterable为空,则将生成1(或start提供值,如果提供)。
小智 5
简单的方法是:
import numpy as np
np.exp(np.log(your_array).sum())
Run Code Online (Sandbox Code Playgroud)