我得到了以下功能: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 回答

慕丝7291255
TA贡献1859条经验 获得超6个赞
您正在查找单个值,而不是值列表。列表理解在这里没有什么意义。
您的错误在于将您的测试放在列表理解的值表达式部分。这不是过滤器,而是您从循环中的(过滤的)元素构建新列表值的部分。
在循环部分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()
只返回第一个值,因此不再进行迭代。这就像您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)
添加回答
举报
0/150
提交
取消