您正在查找单个值,而不是值列表。列表推导在这里毫无意义。
您的错误在于将您的测试放在列表理解的值表达式部分。这不是过滤器,这是您从循环中的(过滤的)元素构建新列表值的部分。
在循环部分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()返回第二个参数 to :StopIteration
result = next(gen, None)
您可以在调用中组合生成器表达式next();如果生成器表达式是唯一的参数,您可以省略(...)生成器表达式的括号,否则包括它们以便与其他参数区分开来:
result = next((i for i in range(11) if 2 * i - 4 == 0), None)