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

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

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

 1

除了列表理解 for循环外,我该怎么做?

linus2wan 回答:找到第一个True时停止列表理解循环

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

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

幸运的是,itertools为您要对列表或任何其他可迭代对象执行某些操作提供了多种功能。

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

def first_true(iterabe,default=False,pred=None):
    return next(filter(pred,iterable),default)

x = first_true(['a',3],pred=int.__instancecheck__)

如果列表中没有与谓词匹配的内容,则first_true将返回False。如果需要其他行为,则可以修改该功能。如果您想了解如何使用itertools样式的迭代器,其他食谱可能是一个不错的起点。


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

,

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

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

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

第二个参数是一个返回值,可让您避免StopIteration错误

编辑(信用@martineau)

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

x = next(filter(int.__instancecheck__,['a',3]),None)
本文链接:https://www.f2er.com/3130532.html

大家都在问