为何Python列表推导式正常运行但同逻辑生成器表达式报错
问题根因
你遇到的报错本质是列表对象和生成器对象的布尔判断规则不同:
- 列表推导式生成的是
list类型实例:空列表[]的布尔值为False,非空列表布尔值为True。你原来的逻辑中if values可以正确识别是否有符合条件的幸运数字,没有的话直接走else返回-1,不会触发max()的空序列报错。 - 生成器表达式返回的是生成器迭代器实例:Python中所有迭代器对象的布尔值永远为
True,和内部是否有元素无关。所以哪怕没有符合条件的幸运数字,if values也会判定为真,执行max(values)时就会因为生成器为空抛出ValueError。
修复方案
有两种简单的修复方式,不需要额外处理生成器耗尽的问题:
方案1:使用max()的默认参数
Python 3.4及以上版本的max()函数支持default参数,传入空序列时会直接返回default的值,不需要提前判断是否有元素:
class Solution: def findLucky(self, arr: List[int]) -> int: values = (n for n in arr if arr.count(n) == n) return max(values, default=-1)
方案2:显式转为列表处理
本来你计算最大值就需要遍历所有符合条件的元素,转成列表不会带来额外的性能损耗,同时可以沿用原来的判断逻辑:
class Solution: def findLucky(self, arr: List[int]) -> int: values = [n for n in arr if arr.count(n) == n] return max(values) if values else -1
注:你原来代码里列表推导式的if n if arr.count(n) ==n可以简化为if n and arr.count(n) ==n,属于语法糖的等价写法,不影响运行结果。
内容的提问来源于stack exchange,提问作者Alan Bagel
相关产品推荐
相关产品推荐

