# Search a sequence for its minimum and stop as soon as the lowest possible value is found

Jussi Piitulainen jussi.piitulainen at helsinki.fi
Fri Jan 6 14:21:32 EST 2017

```Peter Otten writes:

> Example: you are looking for the minimum absolute value in a series of
> integers. As soon as you encounter the first 0 it's unnecessary extra work
> to check the remaining values, but the builtin min() will continue.
>
> The solution is a minimum function that allows the user to specify a stop
> value:
>
>>>> from itertools import count, chain
>>>> stopmin(chain(reversed(range(10)), count()), key=abs, stop=0)
> 0
>
> How would you implement stopmin()?

Only let min see the data up to, but including, the stop value:

from itertools import groupby

def takeuntil(data, pred):
'''Take values from data until and including the first that
satisfies pred (until data is exhausted if none does).'''
for kind, group in groupby(data, pred):
if kind:
yield next(group)
break
else:
yield from group

def stopmin(data, key, stop):
return min(takeuntil(data, lambda o : key(o) == stop),
key = key)

data = '31415926'
for stop in range(5):
print(stop,
'=>', repr(''.join(takeuntil(data, lambda o : int(o) == stop))),
'=>', repr(stopmin(data, int, stop)))

# 0 => '31415926' => '1'
# 1 => '31' => '1'
# 2 => '3141592' => '1'
# 3 => '3' => '3'
# 4 => '314' => '1'

from itertools import count, chain
print(stopmin(chain(reversed(range(10)), count()), key=abs, stop=0))
print(stopmin(chain(reversed(range(10)), count()), key=abs, stop=3))

# 0
# 3
```