您正在寻找一个单值,不是值列表。列表理解在这里没有什么意义。
你的错误在于将你的测试放在价值表达列表理解的部分。这不是过滤器,而是您从循环中的(过滤后的)元素构建新列表值的部分。
Put an if
after the 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]
如果您必须在一行中执行此操作,请使用生成器表达式 https://docs.python.org/3/tutorial/classes.html#generator-expressions,然后使用next()功能 https://docs.python.org/3/library/functions.html#next从中得到第一个结果:
gen = (i for i in range(11) if 2 * i - 4 == 0)
result = next(gen)
这将为您带来最低价值i
即使有多个可能的值i
哪里的if
测试是真的。
生成器是惰性求值的;循环停止的那一刻i
达到一个值,其中if
测试为真,并且产生一个值。next()
仅返回第一个值,因此不再进行迭代。就好像你用过break
in a for
循环(除非您可以稍后继续循环)。
请注意,这可能会引发StopIteration
如果生成器不产生异常any价值观。你可以告诉next()
在这种情况下返回默认值;第二个参数next()
如果返回StopIteration
否则会被提出:
result = next(gen, None)
您可以将生成器表达式组合在next()
称呼;如果生成器表达式是唯一的参数,您可以省略(...)
生成器表达式的括号,否则包含它们,以便可以将其与其他参数区分开来:
result = next((i for i in range(11) if 2 * i - 4 == 0), None)