当找到第一个Tru时,停止循环并理解列表

2024-04-25 09:41:11 发布

您现在位置:Python中文网/ 问答频道 /正文

当我发现第一个是真的时,我想停止迭代,如下所示:

>> for x in ['a', 'b', 1, 2, 3]:
>>    if isinstance(x, int):
>>        print(x)
>>        break

 1

除了使用列表理解for循环,我如何做同样的事情?在


Tags: in列表forif事情intisinstanceprint
2条回答

不幸的是,没有内置机制来查找与谓词匹配的列表的第一个元素。有一个^{},你可以用它来确定是否存在这样一个元素,但这不会告诉你它是什么元素。在

any(isinstance(x, int) for x in ['a', 'b', 1, 2, 3])

幸运的是,^{}提供了多种函数,用于在列表或任何其他iterable上执行操作。在

您要查找的函数不是内置于模块中的,但是文档提供了一些函数的定义,包括这个函数,如itertools recipes。您需要的函数名为first_true。复制定义,然后:

^{pr2}$

如果列表中没有与谓词匹配的内容,first_true将返回False。如果需要不同的行为,可以修改函数。如果您想了解如何使用itertools样式的迭代器,那么其他方法可能是一个很好的起点。在


但是,如果您试图在循环中进行比查找第一个匹配元素更复杂的处理,那么最好使用适当的for循环。列表理解和生成器表达式可以很好地替代map和filter,itertools在iterables上提供了更一般的操作,但它们并不代表真正的循环逻辑。在

可以在生成器表达式上使用next返回第一个True实例:

x = next((a for a in ['a', 'b', 1, 2, 3] if isinstance(a, int)), None)
print(x)
1

x = next((a for a in ['a', 'b'] if isinstance(a, int)), None)
print(x)
None

其中第二个参数是一个返回值,它允许您避免StopIteration错误

编辑(credit@martineau)

这可以简化为filter运算符,如上面的itertools配方所示:

^{pr2}$

相关问题 更多 >