找到第一个True时停止具有列表理解的循环

问题描述 投票:-1回答:2

我想在找到第一个True时停止迭代,如下所示:

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

 1

除了[ for循环外,我该怎么做?

python for-loop list-comprehension break
2个回答
3
投票
[遗憾的是,没有内置机制可以找到与谓词匹配的列表的第一个元素。有any,可用于确定

if此类元素是否存在,但不会告诉您它是什么元素。

any
幸运的是,any(isinstance(x, int) for x in ['a', 'b', 1, 2, 3])
为您要对列表或任何其他可迭代对象执行某些操作提供了多种功能。

您要查找的函数未内置在模块中,但是文档提供了一些函数的定义,包括itertools在内。您需要的功能命名为itertools。只需复制定义,然后:

itertools recipes

如果列表中没有与谓词匹配的内容,则first_true将返回def first_true(iterabe, default=False, pred=None):
    return next(filter(pred, iterable), default)

x = first_true(['a', 'b', 1, 2, 3], pred=int.__instancecheck__)
。如果需要其他行为,则可以修改该功能。如果您想了解如何使用itertools样式的迭代器,其他食谱可能是一个不错的起点。


但是,如果您要在循环中进行比查找第一个匹配元素还要复杂的处理,最好使用适当的first_true循环。列表推导和生成器表达式可以很好地替代map和filter,并且itertools提供了对iterables的更多常规操作,但它们并不代表真正的循环逻辑。

1
投票
您可以在生成器表达式上使用False返回第一个for实例:

next

第二个参数是一个返回值,使您可以避免True错误
© www.soinside.com 2019 - 2024. All rights reserved.