我想要一种惯用的方法来查找列表中与谓词匹配的第一个元素。
当前的代码非常难看:
[x for x in seq if predicate(x)][0]
我考虑过将其更改为:
from itertools import dropwhile dropwhile(lambda x: not predicate(x), seq).next()
但是必须有更优雅的东西......如果它返回一个None值而不是在找不到匹配项时引发异常,那就太好了。
None
我知道我可以定义一个函数,如:
def get_first(predicate, seq): for i in seq: if predicate(i): return i return None
但是,如果有内置函数已经提供了相同的功能,那么开始用这样的实用函数填充代码是非常无味的(人们可能不会注意到它们已经存在,因此它们往往会随着时间的推移而重复)。
seq要查找与 a匹配的序列中的第一个元素predicate:
seq
predicate
next(x for x in seq if predicate(x))
或者简单地说:
蟒蛇2 :
next(itertools.ifilter(predicate, seq))
蟒蛇 3 :
next(filter(predicate, seq))
StopIteration如果谓词与任何元素都不匹配,这些将引发异常。
StopIteration
None如果没有这样的元素,则返回:
next((x for x in seq if predicate(x)), None)
或者:
next(filter(predicate, seq), None)