如何将列表中的所有项目与Python相乘?

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)

  • @jheld:我计时产生从1到100的数字.在python2和3中,`lambda`平均重复.02s/1000次,而`operator.mul`平均重复.009s/1000次重复,使`operator.mul`快一个数量级. (29认同)
  • 从 Python 3.8 开始,可以使用 math.prod([1,2,3,4,5,6]) 简单地完成。(当然需要导入) (4认同)
  • @wordsforthewise可能是通过额外的函数(lambda)增加了开销,而`operator.mul`直接进入C. (3认同)
  • 我真的不会把.009称为低于.02的数量级.这只是一半左右. (3认同)

ice*_*ime 163

您可以使用:

import operator
import functools
functools.reduce(operator.mul, [1,2,3,4,5,6], 1)
Run Code Online (Sandbox Code Playgroud)

请参阅reduceoperator.mul文档以获得解释.

你需要import functoolsPython 3+中的这一行.

  • 请注意,在python3中,`reduce()`函数已从全局命名空间中删除并放在`functools`模块中.所以在python3中你需要说'来自functools import reduce`. (31认同)
  • @wordsforthewise没有第三个参数,如果你传递一个空序列,它会抛出一个TypeError异常 (5认同)
  • 在这里不需要作为第三个参数的“ 1”,在什么情况下需要它? (2认同)

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)

  • 如果你已经在使用Numpy,那就方便了.您可能甚至不需要首先将其作为列表进行转换,这应该适用于大多数情况`result = np.prod(mylist)` (11认同)
  • 需要注意两件事:**1)**它可能会溢出,特别是如果使用上面的默认`numpy.int32`**2)**对于小列表,这将明显变慢,因为NumPy需要分配一个数组(如果经常重复相关) (4认同)
  • 此处 ``np.prod(np.array(range(1,21)))``np.prod(np.array(range(1,21)))`` 的值超出 21 (2认同)

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)

  • 小注意:Python中的切片非常简单,因为我们这里只处理基元,所以你可以通过从list [0]开始并迭代list [1:]来避免从1开始的小问题.虽然从长远来看,对功能更强的"减少"答案感到满意是有价值的,因为它在其他情况下也很有用. (5认同)
  • @kungphu 空乘积通常定义为 1,如果您向其传递空序列,您的解决方案将抛出 IndexError 异常 (5认同)
  • @kungphu,这个答案的行为是正确的,即传递长度为 1 的列表返回值,传递长度为 0 的列表返回 1。它与将 sum([]) 给出为 0 或 sum 的思路相同([3]) 为 3。参见:https://en.wikipedia.org/wiki/Empty_product (4认同)
  • 我明白你关于数学函数的观点。然而,在实际的开发情况下,我将其称为一种非常罕见的情况,其中明确打算对输入进行操作的函数_应该_在给定无输入或无效输入的情况下返回一个值。我想这取决于练习的目标:如果只是复制标准库,好吧,也许它可以教会人们一些关于该(或一种)语言是如何实现或可以实现的知识。否则我会说它错过了一个提供关于有效和无效论点的教训的好机会。 (2认同)

小智 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循环),对我来说很直观(看起来我怎么想到这个问题,只需取一个,乘以它,再乘以下一个,依此类推! )

  • 为什么不`我在n:`,然后`total*= i`?会不是更简单? (4认同)
  • 太棒了,这是最简单,最简单的. (3认同)

pis*_*ock 8

这是我的机器的一些性能测量.在长时间运行的循环中对小输入执行此操作时相关:

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的溢出情况.

  • 我怀疑“multiply_functools”和“multiply_numpy”由于必须查找“np”、“functools”和“operator”全局变量以及随后的属性查找而受到压力。你介意换成当地人吗?函数签名中的“_reduce=functools.reduce”、“_mul=operator.mul”,然后主体中的“return _reduce(_mul, iterable)”等。 (2认同)
  • 此外,numpy 版本必须首先将数字转换为 numpy 数组;您通常已经进行了这种转换,将其包含在时间安排中并不公平。将列表一次转换为 numpy 数组后,`np.prod()` 选项在 100 个或更多元素时启动变得最快。 (2认同)

小智 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)


Xav*_*hot 7

从开始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)

  • 那么只是`np.prod(your_Array)` (8认同)