如何使用 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,...

问题描述:

给定一个数字列表,例如[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)

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

您需要import functoolsPython 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))
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1343  
  信创产业的蓬勃发展推动着各行业数字化转型加速,数据库迁移作为其中关键一环,面临诸多挑战。信创数据库迁移旨在将传统数据库平稳过渡到信创环境,以满足自主可控、安全可靠的需求。这一过程涉及技术、业务等多方面因素,稍有不慎就可能出现各种问题,影响业务的正常运行。深入探讨信创数据库迁移过程中的常见问题及解决方案,对于保障迁移工作...
2027年信创国产化   41  
  随着信息技术的飞速发展,信创国产化成为了国家战略的重要组成部分。国产化信创产品名录涵盖了众多领域,其在各个关键应用场景中发挥着重要作用。而信创国产化操作系统作为其中的核心环节,具备五大核心优势,为我国信息技术产业的自主可控发展提供了坚实支撑。关键应用场景之办公领域在办公领域,国产化信创产品有着广泛且深入的应用。如今,越...
国产信创系统   37  
  随着信息技术的飞速发展,信创国产化操作系统在政府部门的推广应用具有重要的战略意义。它不仅关乎国家信息安全,更是推动国内信息技术产业自主创新、实现科技自立自强的关键举措。在当前复杂的国际形势下,政府部门积极推广信创国产化操作系统,对于保障国家政务信息的安全稳定运行,提升信息技术的自主可控能力,具有不可替代的重要作用。推广...
信创产品有哪些   28  
  在企业数字化转型的进程中,信创数据库解决方案的选择至关重要。它不仅关乎企业数据的安全存储与管理,更影响着企业业务的稳定运行与未来发展。合适的信创数据库能够助力企业在复杂多变的市场环境中提升竞争力,保障数据主权与安全。然而,面对市场上众多的信创数据库产品和解决方案,企业往往感到困惑,不知如何做出正确的选择。接下来,我们将...
信创电脑   24  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用