2

我被赋予了以下功能:

x**2 - 4*x + 6

任务是找到 0 到 10 之间的最小整数值 x。我不得不使用for循环:

for i in range(11):
    if 2*i-4==0:
        print("Minimum of the given function is:", i)

这给了我正确的答案2

现在我应该将其翻译为列表理解,但我不知道在哪里放置if语句:

mylist = [2*i-4==0 for i in range(11)]
print(mylist)

当然,作为输出,我得到一个true/false列表,索引 2 是正确的true。但是如何在我的列表理解中包含 if 呢?

4

2 回答 2

2

您正在查找单个值,而不是值列表。列表推导在这里毫无意义。

您的错误在于将您的测试放在列表理解的值表达式部分。这不是过滤器,这是您从循环中的(过滤的)元素构建新列表值的部分。

在循环部分if 之后放置一个:for

[i for i in range(11) if 2 * i - 4 == 0]

这将构建一个只有一个元素的列表,该元素的i值为 true:

>>> [i for i in range(11) if 2 * i - 4 == 0]
[2]

如果您必须在一行中执行此操作,请使用生成器表达式,然后使用该next()函数从中获取第一个结果:

gen = (i for i in range(11) if 2 * i - 4 == 0)
result = next(gen)

这将为您提供最小值,i即使对于测试为真的i位置有多个可能的值。if

生成器被懒惰地评估;循环在i达到if测试为真的值时停止,并产生一个值。next()只返回第一个值,因此不再进行迭代。就像您breakfor循环中使用一样(除非您可以稍后继续循环)。

请注意,StopIteration如果生成器不产生任何值,这可能会引发异常。在这种情况下,您可以告诉next()返回默认值;否则将next()返回第二个参数 to :StopIteration

result = next(gen, None)

您可以在调用中组合生成器表达式next();如果生成器表达式是唯一的参数,您可以省略(...)生成器表达式的括号,否则包括它们以便与其他参数区分开来:

result = next((i for i in range(11) if 2 * i - 4 == 0), None)
于 2018-09-26T16:26:23.527 回答
1

如果您真的想在这里使用理解而不是经典循环,因为只有一个结果,您可以将生成器传递给next默认值,以防万一它找不到任何东西:

next((i for i in range(11) if 2*i-4==0),None)
于 2018-09-26T16:26:22.800 回答