【问题标题】:Having trouble with generator in list comprehension列表理解中的生成器有问题
【发布时间】:2016-02-06 01:08:32
【问题描述】:

我正在尝试在 codefights 中完成一项挑战,但我似乎陷入了困境:

SyntaxError: Generator expression must be parenthesized if not sole argument

当我执行时

def magicNumber(n):
    return [i for i in itertools.takewhile
                       (lambda x: x % d for d in [3,5,7] == 0, range(0,n))]

挑战是:考虑唯一的质因数是 3、5 和 7 的数字。编写一个程序来找出其中的第 n 个最大的数。

示例输出:

  • 对于n = 1,输出应为:1 (3^0 * 5^0 * 7^0)
  • 对于n = 2,输出应为:3 (3^1 * 5^0 * 7^0)
  • 对于n = 6,输出应为:15(3^1 * 5^1 * 7^0)

我知道我远远没有解决这个问题我只是想知道这里有什么问题。

【问题讨论】:

    标签: python algorithm python-2.7 list-comprehension generator-expression


    【解决方案1】:

    您需要将您的生成器表达式放在括号中的lambda 函数中,而且我认为您需要检查x % d 的结果是否等于零:

    lambda x: (x % d==0 for d in [3,5,7])
    

    【讨论】:

      【解决方案2】:

      需要加括号:

      takewhile(lambda x: (x % d for d in [3,5,7] == 0), range(0,n))
      

      请注意,您的原始代码被解析为:

      takewhile((lambda x: x % d) for d in [3,5,7] == 0, range(0,n))
      

      即解析器认为您正在创建一个生成器,将lambdas 作为takewhile 的第一个参数。而且您正在使用两个参数对takewhile 进行函数调用,这需要在生成器周围加上括号,所以如果您真的想这样做,您必须编写:

      takewhile(((lambda x: x % d) for d in [3,5,7] == 0), range(0,n))
      

      【讨论】:

      • 这并没有解决主要问题,即== 0 放错了位置。
      • 这解决了语法错误,这是我的问题的目标,谢谢。还要感谢如何解析代码。我不确定` == 0 `是在错误的地方,我觉得这样更直观。编辑:没关系,我意识到你的意思我修好了。
      • @TomKarzes 我不同意。主要问题是句法错误,而不是语义错误。那将是一个跟进问题。
      • 嗯,有几个问题。括号解决了分组问题,但== 0 似乎不止于此。
      猜你喜欢
      • 2018-04-20
      • 2013-12-30
      • 2021-04-07
      • 2016-10-04
      • 1970-01-01
      • 2023-02-02
      • 2018-08-11
      • 2017-08-05
      相关资源
      最近更新 更多