我想在找到第一个True时停止迭代,如下所示:
>> for x in ['a','b',1,2,3]:
>> if isinstance(x,int):
>> print(x)
>> break
1
除了列表理解 for循环外,我该怎么做?
我想在找到第一个True时停止迭代,如下所示:
>> for x in ['a','b',1,2,3]:
>> if isinstance(x,int):
>> print(x)
>> break
1
除了列表理解 for循环外,我该怎么做?
不幸的是,没有内置机制可以找到与谓词匹配的列表的第一个元素。有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
错误
可以将其简化为filter
运算符,如上面的itertools配方所示:
x = next(filter(int.__instancecheck__,['a',3]),None)