【问题标题】:Python multiplying all even numbers in a listPython将列表中的所有偶数相乘
【发布时间】:2016-10-03 15:48:16
【问题描述】:

我正在为我的第一个编程课程编写这个 python 代码。昨天它部分工作,但后来我改变了一些东西,现在它只通过了 1 个测试用例。目标是将列表“xs”中的所有偶数相乘,如果没有偶数则返回 1。我做错了什么,我该如何解决?

def evens_product(xs):
    product = 2
    for i in xs:
        if i%2 == 0:
            product *= i
            return product

    else:
        return (1) 

编辑:Chepner 的解决方案很有效,感谢所有提供帮助的人

【问题讨论】:

  • 当列表中有个偶数时,该函数的返回值是什么?
  • 我认为从 product = 2 开始是错误的?不应该是product = 1吗?
  • 当出现偶数时,程序应该将列表中的所有偶数相乘并返回最终值(例如,如果列表是 [2,4,6,8]应该返回 384) 并且仅当不存在偶数时才返回 1。编辑:Product = 1 也不起作用,不确定它应该等于什么
  • 您没有显示任何失败的测试用例或其输出,因此很难知道您希望看到什么行为。我猜你打算以product = 1 开头。
  • 你的代码有几个问题:第一个是你以product = 2而不是product = 1开头;第二个错误是您应该在遍历循环的所有元素之后(即在 for 循环之后)返回答案。目前,代码在找到第一个偶数后返回。如果您遵循这种方法,您甚至不需要底部的 else 语句。

标签: python list numbers multiplication


【解决方案1】:

您需要初始化product = 1,原因有两个。一,简单地说,你会得到错误的答案。 evens_product([4]) 应该返回 4,而不是 8。 第二,它使您不必将没有偶数的列表视为特殊情况。如果没有偶数,则永远不要更改 product 的值并原样返回。

def evens_product(xs):
    product = 1
    for i in xs:
        if i%2 == 0:
            product *= i
    return product

【讨论】:

  • 添加的递归版本让我重新考虑我的赞成票:-)。我认为它在各方面都更糟......
  • 我接受了您的建议,但仍然存在问题。对于列表 [1,2,3,4,5],它返回 2,当列表为空时,它返回“None”,当没有偶数存在时,它返回“None”。这绝对是一个令人困惑的任务
  • 这绝对是更糟糕的 Python。我可能应该将其保留为伪代码。
  • @famguy74 你输错了。这两个版本都不会在任何输入上返回 None,并且对于 [1,2,3,4,5] 都返回 8。 (我确实修复了递归函数中的一些拼写错误,但无论如何你都不应该使用它。)
  • @chepner 你是对的,格式有问题,或者我开始了一个新文件,你的解决方案有效,所以我选择你的答案作为最佳答案
【解决方案2】:

一种方法是使用functools 中的reduce() 函数和operator.mul() 函数。

reduce() 函数接受一个函数,该函数接受三个参数(在本例中为 operator.mul())、一个可迭代对象(在本例中为一个列表)和默认值。

它将函数应用于前两个元素,产生一个结果。它采用该结果,并将该函数应用于结果和列表的第三个元素,然后将该结果应用于第四个元素,依此类推。它重复这个过程,直到所有参数都被迭代。

在这种情况下,operator.mul() 用于描述乘法运算。例如,operator.mul(2,3) 是 6。

最后,您可以使用列表推导式在列表中选择偶数值,并在末尾添加 if 子句。如果i 是偶数,则i % 2 的值应该为零,因为% 是取模运算符,它返回左边除以右边后的余数。

下面是实现的样子,尽管您应该定义没有偶数时的行为,可能使用try: except: 块。


添加默认/初始值1 以避免在空列表的情况下出错。

import functools, operator
def even_product(lst):
    return functools.reduce(operator.mul, [i for i in lst if i%2 == 0], 1)

【讨论】:

  • 请补充说明。
  • 请注意,如果列表中没有偶数元素,则会引发错误。除非在每种情况下都保证有偶数,否则应该定义这种行为。
【解决方案3】:

这将是你的答案:

def evens_product(xs):
    product = 1
    for i in xs:
        if i%2 == 0:
            product *= i  
    return product

不需要return1,因为产品已经分配了1。 由于您在for 循环中有return,因此它在识别第一个偶数后返回该值。希望对您有所帮助。

【讨论】:

  • 你的“else”子句永远不会到达,对吧?我认为如果您删除 else 子句并将产品启动到 1 是正确的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 2022-01-07
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多