我被赋予了这个功能:
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 包含在我的列表理解中?
最佳答案
您正在查找单个值,而不是值列表。列表理解在这里没有什么意义。
您的错误在于将测试放入列表理解的值表达式部分。这不是过滤器,而是您从循环中的(过滤后的)元素构建新列表值的部分。
在 for
循环部分之后放置一个 if
:
[i for i in range(11) if 2 * i - 4 == 0]
这会构建一个仅包含一个元素的列表,即值为 true 的 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
测试为 true 的某个值时,循环就会停止,并生成该值。 next()
仅返回第一个值,因此不再进行迭代。这就好像您在 for
循环中使用了 break
(除非您稍后可以继续循环)。
请注意,如果生成器不生成任何值,这可能会引发 StopIteration
异常。在这种情况下,您可以告诉 next()
返回默认值;如果 StopIteration
被引发,则返回 next()
的第二个参数,否则:
result = next(gen, None)
您可以在 next()
调用中组合生成器表达式;如果生成器表达式是唯一的参数,则可以省略生成器表达式的 (...)
括号,否则包含它们,以便可以将其与其他参数区分开来:
result = next((i for i in range(11) if 2 * i - 4 == 0), None)
关于python - 将 if 条件放在列表理解中的哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52522232/