【问题标题】:List comprehension works but not generator expression [duplicate]列表理解有效,但生成器表达式无效
【发布时间】:2021-11-12 09:44:51
【问题描述】:

我正在做这个问题:

给定一个整数数组 arr,幸运整数是一个整数,它在数组中的频率等于它的值。 返回数组中的幸运整数。如果有多个幸运整数,则返回其中最大的一个。如果没有幸运整数返回-1。

我正在使用此代码,该代码有效并通过了所有测试:

class Solution:
    def findLucky(self, arr: List[int]) -> int:
        values = [n for n in arr if n if arr.count(n) == n]
        return max(values) if values else -1

但是,当我尝试将列表理解更改为生成器表达式时:

class Solution:
    def findLucky(self, arr: List[int]) -> int:
        values = (n for n in arr if n if arr.count(n) == n)
        return max(values) if values else -1

我收到此错误:

Traceback (most recent call last):
  File "...", line 10, in <module>
    print(Solution().findLucky([2, 3, 4]))
  File "...", line 7, in findLucky
    return max(values) if values else -1
ValueError: max() arg is an empty sequence

为什么列表推导有效,而生成器表达式失败?

我已尝试将生成器表达式转换为推导式中的列表,但这不起作用,因为生成器已经过时了。

【问题讨论】:

  • 生成器总是真实的,无论它是否会产生任何值。

标签: python list-comprehension generator-expression


【解决方案1】:

每个生成器都是真的,所以即使生成器是“空的”,你也总是调用max(values)。正确的做法是告诉max接下来该怎么做:

return max(values, default=-1)

【讨论】:

  • 说生成器是“空的”甚至有点牵强,因为它们不是容器。它们是生产者,判断生成器是否会产生值的唯一方法是尝试通过迭代器协议检索它。
  • @chepner 好的,把它放在引号里,希望这足够清楚:-)
猜你喜欢
  • 1970-01-01
  • 2023-02-02
  • 2013-04-24
  • 2021-01-13
  • 2016-12-26
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多