列表理解中的生成器有问题

时间:2015-11-05 09:13:48

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

我正在尝试在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)

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

2 个答案:

答案 0 :(得分:3)

您需要添加括号:

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))

即。解析器认为你正在创建一个生成器,产生lambda s作为takewhile的第一个参数。并且您正在使用两个参数对takewhile进行函数调用,这需要在生成器周围使用括号,因此如果您真的想要这样做,则必须编写:

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

答案 1 :(得分:2)

你需要将你的生成器表达式放在括号中的lambda函数中,我认为你需要检查x % d的结果与零的相等性:

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