【问题标题】:Python: Getting the Sum of a Lambda FunctionPython:获取 Lambda 函数的总和
【发布时间】:2013-03-14 22:37:44
【问题描述】:

我正在尝试使用 lambda 函数在 Python 中获取低于 2,000,000 的所有质数的总和。 (我已经暴力破解了它,但这需要的时间太长了,我想要一个更好的解决方案。)这是我目前所拥有的:

def isPrime(n):
    for x in range(2, int(n**0.5)+1):
        if n%x==0: return False
    return True


print reduce(lambda x: isPrime(x), [range(200)])

现在,这只是打印从 1 到 200 递增的数字,所以我认为 reduce 不起作用 =\

有人有什么建议吗?

【问题讨论】:

  • 传递给reduce()的函数接受两个参数;序列中的前一个结果和当前元素。你想改用filter() 吗?
  • [range(200)] 创建了一个包含 one 元素的列表,另一个包含 200 个数字的列表。当输入列表中只有一个元素时,reduce()什么都不做,并返回该输入元素。
  • 我给它两个参数;序列在括号中,范围(200)。
  • 当我使用过滤器时,它只返回布尔值。
  • 你需要使用reduce(..., range(200)),即使这样也是错误的,因为我认为你不明白reduce() 做了什么

标签: python math lambda


【解决方案1】:

您的代码发生了一些奇怪的事情。

  • 我认为您实际上想使用filter(),而不是reduce()
  • lambda x: isPrime(x)等价于isPrime(毕竟isPrime已经是返回isPrime结果的函数了)。
  • [range(200)] 创建一个嵌套列表。外部列表中唯一的元素是数字从 0 到 200 的列表。我认为您只需要单个列表。

所以,试试以下方法:

print filter(isPrime, range(200))

【讨论】:

  • 有什么方法可以将值增加 2 以便提高效率吗?我正在使用 sum(filter(isPrime, range(2000000))) 并且我需要它比蛮力方法更快。
  • 您的 isPrime 函数是该方法的蛮力部分。改进它将比任何元素总和的优化带来更大的性能改进。
  • @Tetramputechture 使用 range(1, 200, 2) 增加 2,但 Tyler 是对的,您的重点应该放在更好的主要测试功能上。 This answer should help.
【解决方案2】:

这里有很多问题。第一个是您可以简单地将lambda x: isPrime(x) 替换为isPrime。函数是 Python 中的第一类,这意味着您可以像传递整数或字符串一样传递它们。第二个是您正在传递一个列表列表; [range(200)] 是一个包含range(200) 返回值的列表,范围返回一个列表,因此您只减少一个值。这解决了第三个问题,即您的reduce 函数应该接受2 个参数,因为reduce 调用该函数作为时间传递给成对的项目。实际上,只有一个项目,因此该函数被调用 0 次并返回列表中的第一个项目。

我怀疑您想要做的是过滤列表,您可以使用 filter 函数来执行此操作,或者您可以使用如下所示的列表推导:

[x for x in range(200) if isPrime(x)]

【讨论】:

  • 它显示 :P 在 Python 命令行中尝试 help(range) 回答您的增量 2 个问题。
  • 只是一个更多的东西 :) 为什么当我输入 print sum([x for x in range(1, 10, 2) if isPrime(x)]) 时它会打印 15
  • 别忘了把 2 加回来。 2 是素数,你用 range(1, 10, 2) 跳过它。另外,从 3 开始可能会更好。1 的素数不是一个容易回答的问题。即:范围(3、10、2)
猜你喜欢
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
相关资源
最近更新 更多