Issue #18652: Add an itertools recipe for first_true()

This commit is contained in:
Raymond Hettinger 2014-04-02 03:16:42 -07:00
parent f4284e45d0
commit 31b26f637a
2 changed files with 29 additions and 0 deletions

View File

@ -784,6 +784,19 @@ which incur interpreter overhead.
except exception: except exception:
pass pass
def first_true(iterable, default=False, pred=None):
"""Returns the first true value in the iterable.
If no true value is found, returns *default*
If *pred* is not None, returns the first item
for which pred(item) is true.
"""
# first_true([a,b,c], x) --> a or b or c or x
# first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
return next(filter(pred, iterable), default)
def random_product(*args, repeat=1): def random_product(*args, repeat=1):
"Random selection from itertools.product(*args, **kwds)" "Random selection from itertools.product(*args, **kwds)"
pools = [tuple(pool) for pool in args] * repeat pools = [tuple(pool) for pool in args] * repeat

View File

@ -1998,6 +1998,19 @@ Samuele
... # unique_justseen('ABBCcAD', str.lower) --> A B C A D ... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
... return map(next, map(itemgetter(1), groupby(iterable, key))) ... return map(next, map(itemgetter(1), groupby(iterable, key)))
>>> def first_true(iterable, default=False, pred=None):
... '''Returns the first true value in the iterable.
...
... If no true value is found, returns *default*
...
... If *pred* is not None, returns the first item
... for which pred(item) is true.
...
... '''
... # first_true([a,b,c], x) --> a or b or c or x
... # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
... return next(filter(pred, iterable), default)
This is not part of the examples but it tests to make sure the definitions This is not part of the examples but it tests to make sure the definitions
perform as purported. perform as purported.
@ -2075,6 +2088,9 @@ True
>>> list(unique_justseen('ABBCcAD', str.lower)) >>> list(unique_justseen('ABBCcAD', str.lower))
['A', 'B', 'C', 'A', 'D'] ['A', 'B', 'C', 'A', 'D']
>>> first_true('ABC0DEF1', '9', str.isdigit)
'0'
""" """
__test__ = {'libreftest' : libreftest} __test__ = {'libreftest' : libreftest}