首页 > 解决方案 > 带有值检查的生成器表达式

问题描述

我有以下代码片段来找出给定数字列表中的任何一对是否与给定总和匹配。

我已经实现了如下功能

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)

我的问题是,是否有任何可能的方式将其实现为生成器表达式。?

例如,有没有办法检查当前部分创建的生成器是否在理解中具有给定值?

标签: pythonpython-2.7generatorlist-comprehension

解决方案


如果你真的想这样做,一切皆有可能,但并非所有事情都是可取的:

from itertools import combinations, dropwhile

def google(numbers, total):
    return bool(next(dropwhile(lambda c: sum(c) != total, combinations(numbers, 2)), False))

我们遍历所有可能的 2 数组合numbersusingcombinations并将它们与total.

使用dropwhile,我们可以模拟原始代码的短路行为,仅获得满足条件的第一个组合(如果存在)。然后,它将作为非空tuple值转换为布尔文字True。否则,next将看到它dropwhile为空,并返回默认值False

测试:

print(google([1, 2, 3, 4, 5], 8))
print(google([1, 2, 3, 4], 8))

输出:

True
False

推荐阅读