( ) - bisect ( , ).
import bisect
ranges = (
(0, 1234),
(5001, 1231),
(10001, 3242),
(50001, 3543),
(100001, 2303),
)
def find_range(value):
min_ = ranges[0][0]
if min_ > value:
raise ValueError('Values smaller than %d are not supported' % min_)
key = value + 1, 0
index = bisect.bisect(ranges, key)
start_index, id_ = ranges[index - 1]
return id_
print 'Testing standard ranges'
for i in range(15):
i = 2 ** i
print 'Looking for %d, got: %d' % (i, find_range(i))
print
print 'Testing corner cases:'
for start, id_ in ranges:
for i in range(start - 1, start + 2):
try:
value = find_range(i)
except ValueError, value:
pass
print 'Looking for %d, got: %s' % (i, value)
:
Testing standard ranges
Looking for 1, got: 1234
Looking for 2, got: 1234
Looking for 4, got: 1234
Looking for 8, got: 1234
Looking for 16, got: 1234
Looking for 32, got: 1234
Looking for 64, got: 1234
Looking for 128, got: 1234
Looking for 256, got: 1234
Looking for 512, got: 1234
Looking for 1024, got: 1234
Looking for 2048, got: 1234
Looking for 4096, got: 1234
Looking for 8192, got: 1231
Looking for 16384, got: 3242
Testing corner cases:
Looking for -1, got: Values smaller than 0 are not supported
Looking for 0, got: 1234
Looking for 1, got: 1234
Looking for 5000, got: 1234
Looking for 5001, got: 1231
Looking for 5002, got: 1231
Looking for 10000, got: 1231
Looking for 10001, got: 3242
Looking for 10002, got: 3242
Looking for 50000, got: 3242
Looking for 50001, got: 3543
Looking for 50002, got: 3543
Looking for 100000, got: 3543
Looking for 100001, got: 2303
Looking for 100002, got: 2303