我有以下代码片段来找出给定数字列表中的任何一对是否匹配给定总和。
我已经实现了以下功能
def google(numbers, total):
complement =[]
for x in numbers:
if x in complement:
return True
else: complement.append(total-x)
return False
print google([1,2,3,4,5],8)
我的问题是,有没有可能将其实现为生成器表达式的方式。 ?
例如,是否有一种方法可以检查当前部分创建的生成器在理解内是否具有给定值?
答案 0 :(得分:1)
如果您真的想这样做,那么所有的事情都是可能的,但并非所有的事情都是理想的:
from itertools import combinations, dropwhile
def google(numbers, total):
return bool(next(dropwhile(lambda c: sum(c) != total, combinations(numbers, 2)), False))
我们使用numbers
遍历combinations
的所有可能的2数组合,并将它们与total
进行比较。
使用dropwhile
,我们可以模拟您原始代码的短路行为,仅获得满足条件的 first 组合(如果存在)。然后,它将作为非空tuple
转换为布尔文字True
。否则,next
将看到dropwhile
为空,并返回默认值False
。
测试:
print(google([1, 2, 3, 4, 5], 8))
print(google([1, 2, 3, 4], 8))
输出:
True
False