将if条件放在列表理解中的哪里?

时间:2018-09-26 16:20:51

标签: python python-3.x for-loop if-statement list-comprehension

我被赋予了功能:

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纳入列表理解范围?

2 个答案:

答案 0 :(得分:1)

如果您真的想使用理解而不是经典的循环,由于只有一个结果,可以将生成器传递给具有默认值的next,以防万一它什么也没找到:

next((i for i in range(11) if 2*i-4==0),None)

答案 1 :(得分:0)

您找到的是单个值,而不是值列表。列表理解在这里毫无意义。

您的错误是将测试放入列表理解的值表达式部分。那不是一个过滤器,而是从循环中(已过滤的)元素构建新列表值的部分。

if循环部分的后面放置for

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

这将建立一个仅包含一个元素的列表,该元素的值为i,该值为真:

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

如果必须单行执行此操作,请使用generator expression,然后使用next() function从中获得第一个结果:

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

即使在i测试为真的情况下,i可能有多个可能的值,这也会为您带来if的最小值。

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

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

result = next(gen, None)

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

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