566
+ − 1 #!/usr/bin/env python
+ − 2
+ − 3 def find_index(ordered_array, to_find):
+ − 4 """
+ − 5 Return index of ``to_find`` via binary search.
+ − 6 Returns None if not in ``ordered_array``
+ − 7
+ − 8 ordered_array -- array of ordered values
+ − 9 to
+ − 10 """
+ − 11 if not ordered_array:
+ − 12 return
+ − 13 minimum = 0
+ − 14 maximum = len(ordered_array)-1
+ − 15 while True:
+ − 16 middle = (minimum + maximum)/2
+ − 17 value = ordered_array[middle]
+ − 18 if value == to_find:
+ − 19 return middle
+ − 20 if maximum == minimum:
+ − 21 return
+ − 22 if value < to_find:
+ − 23 minimum = middle+1
+ − 24 continue
+ − 25 if value > to_find:
+ − 26 maximum = middle
+ − 27 continue
+ − 28
+ − 29 if __name__ == '__main__':
+ − 30 import unittest
+ − 31
+ − 32 class TestFindIndex(unittest.TestCase):
+ − 33 values = [1,2,4,8,16,17]
+ − 34 def test_spotcheck(self):
+ − 35 for index, value in enumerate(self.values):
+ − 36 self.assertEqual(find_index(self.values, value), index)
+ − 37
+ − 38 unittest.main()