【问题标题】:generator expression with value check带有值检查的生成器表达式
【发布时间】:2019-10-05 19:10:00
【问题描述】:

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

我实现的功能如下

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)

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

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

【问题讨论】:

  • 生成器和列表推导是两个不同的东西。你是什​​么意思?
  • 如果仅仅因为事实理解没有办法像循环一样短路,它就不可能是等价的。您可以过滤,但这样做会很笨拙。 def google(numbers, total): return total in map(sum, combinations(numbers, r=2)) 怎么样?
  • 同意@ReutSharabani。对于那些不熟悉它的人,要使用combinations(),因为@ReutSharabani 建议您首先需要包含from itertools import combinations 这一行。
  • 注意:它们是生成器表达式,而不是推导式。

标签: python python-2.7 generator list-comprehension


【解决方案1】:

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

from itertools import combinations, dropwhile

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

我们使用combinations 遍历numbers 的所有可能的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

【讨论】:

  • @DavisHerring 我尝试了多种解决方案并分心了。其实不需要chain
猜你喜欢
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 2021-12-28
  • 2013-09-02
  • 2022-12-03
  • 2012-07-13
相关资源
最近更新 更多