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

标签 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 包含在我的列表理解中?

最佳答案

您正在查找单个值,而不是值列表。列表理解在这里没有什么意义。

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

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/

相关文章:

python - ModelAdmin中保存模型时如何查看初始数据?

python - Azure 存储访问被拒绝

python - 在 Heroku 上使用 Flask 应用程序运行 RQScheduler

python-3.x - PyDrive 快速入门和错误 403 : access_denied

@property 中的 Python 排序

arrays - 如何找到一组坐标中最大的x,y坐标?

PHP Mysql查询获取特定日期范围内所有星期一的时间范围并将这些不同的开始和结束时间放入数据库中

ruby-on-rails - 更新嵌套哈希参数。更新 Action ,ruby on rails

python - 使用 CiscoConfParse 查找应用于 VTY 的 ACL,然后检查 ACL 的日志语句

java for循环问题