能否用Generator Expression实现列表两数之和匹配检测功能?
用生成器表达式实现两数之和检测?
当然可以实现,但得先明确一点:生成器表达式本身是惰性、一次性的,没办法直接在推导式内部回溯已经生成的元素。不过我们可以结合生成器表达式的短路特性,搭配一个外部状态容器来达成目标,而且效率甚至比你原来的列表实现更高。
先回顾下你原函数的核心逻辑:遍历数字时维护一个补数列表,每次检查当前数字是否是之前某个数字的补数(也就是它是否在补数列表里),如果是就返回True,否则把当前数字的补数加入列表,遍历完没找到就返回False。
用生成器表达式的话,我们可以借助any()函数的短路求值特性,再配合一个集合(比列表的in操作效率更高,是O(1)时间复杂度)来实现:
def google(numbers, total): complement = set() return any(x in complement or complement.add(total - x) for x in numbers) print(google([1,2,3,4,5], 8)) # 输出True
这里的逻辑拆解:
- 初始化一个空集合
complement来存储已经遍历过数字的补数 - 生成器表达式逐个迭代
numbers中的每个x:- 先判断
x in complement:如果为True,any()会立刻返回True,整个过程直接终止(短路特性,不用遍历剩余元素) - 如果
x不在集合里,就执行complement.add(total - x)——注意add()方法返回None,所以or后面的部分等价于False,生成器会继续处理下一个元素
- 先判断
- 如果遍历完所有元素都没找到符合条件的数,
any()最终返回False
如果你非要追求“纯生成器表达式”(不借助外部集合),那其实做不到——因为生成器表达式无法内部保存状态,也无法回溯已经生成的元素。上面的写法已经是最贴近生成器表达式的实现方式了,既利用了生成器的惰性求值,又保留了原函数的核心逻辑,还提升了效率。
内容的提问来源于stack exchange,提问作者user1998790
相关产品推荐
相关产品推荐

