help with silly algorhythm

Jason Orendorff jason at jorendorff.com
Fri Feb 15 18:34:02 CET 2002

```Kevin Parks writes:
> I realize that this is very odd and convoluted. If anyone can make
> heads or tails of this explanation and would like to help me I
> would be grateful.

It should be faster, too, especially for large 'partners' lists.
You could do even better if you could guarantee that 'values'
is sorted too.

## Jason Orendorff    http://www.jorendorff.com/

# sillyalg.py - Silly algorithm

import bisect

values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
partners = [1, 3, 7, 10]

# Mode 1
def upper(list, item):
""" Return the least element greater than item in list.
The list must be sorted!

If item is greater than all items in 'list', then wrap around and
return the least item.
"""
index = bisect.bisect_right(list, item)
if index == len(list):
index = 0
return list[index]

print "Mode 1"
print [[i, upper(partners, i)] for i in values]
print [upper(partners, i) for i in values]

# Mode 2
def lower(list, item):
""" Analogous to upper(). """
index = bisect.bisect_left(list, item)
if index == 0:
index = len(list)
return list[index - 1]

print "Mode 2"
print [[i, lower(partners, i)] for i in values]
print [lower(partners, i) for i in values]

# Mode 3
def even_upper(list, item, n):
functions = (upper, lower)
fn = functions[n%2]  # choose which function
return fn(list, item)

print "Mode 3"
print [[values[n], even_upper(partners, values[n], n)]
for n in range(len(values))]
print [even_upper(partners, values[n], n) for n in range(len(values))]

```