title: Python binary search-like function to find first number in sorted list greater than a specific value
body: <p>I'm trying to write a function in Python that finds the first number in a sorted list greater than a specific value that I pass in as an argument.  I've found examples online that use simple list comprehensions to achieve this, but for my purposes I need to be performing this operation frequently and on large lists, so a search that runs in linear time is too expensive.</p>
  
  <p>I've had a crack at writing an iterative binary search-like function to achieve this, though I'm coming across some edge cases where it doesn't work correctly.  By the way, the function is not required to deal with a case where there is no larger item in the list.  Here is my existing function:</p>
  
  <pre><code>def findFirstLarger(num, sortedList):
      low = 0; 
      high = len(sortedList) - 1
  
      mid = -1
      while True:
          print("low: " + str(low) + "\t high: " + str(high))
          if (low &gt; high):
              print("Ah geez, low is " + str(low) + " and high is " + str(high))
              return # debugging, don't want this to happen
          if low == high:
              return sortedList[low]
          else:
              mid = (low + high) / 2;
              if num == sortedList[mid]:
                  return sortedList[mid]
              elif num &gt; sortedList[mid]:
                  low = mid + 1
              else:
                  high = mid - 1
  </code></pre>
  
  <p>One case I have noted where this function does not work is as follows:</p>
  
  <pre><code>&gt;&gt;&gt; somenumbers=[n*2 for n in range(131072)]
  &gt;&gt;&gt; somenumbers[-5:]
  [262134, 262136, 262138, 262140, 262142]
  
  
  &gt;&gt;&gt; binsearch.findFirstLarger(262139,somenumbers)
  low: 0   high: 131071
  low: 65536   high: 131071
  low: 98304   high: 131071
  low: 114688  high: 131071
  low: 122880  high: 131071
  low: 126976  high: 131071
  low: 129024  high: 131071
  low: 130048  high: 131071
  low: 130560  high: 131071
  low: 130816  high: 131071
  low: 130944  high: 131071
  low: 131008  high: 131071
  low: 131040  high: 131071
  low: 131056  high: 131071
  low: 131064  high: 131071
  low: 131068  high: 131071
  low: 131070  high: 131071
  low: 131070  high: 131069
  Ah geez, low is 131070 and high is 131069
  </code></pre>
  
  <p>Here the correct result would be <code>262140</code>, as this is the first number in the list greater than <code>262139</code>.</p>
  
  <p>Can anyone recommend a cleaner implementation of this that actually works? I didn't think this would be such an esoteric problem, though I haven't been able to find a solution anywhere as of yet.</p>