我被赋予了功能:
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纳入列表理解范围?
答案 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)