Питонический способ как найти значение между двумя значениями в списке - PullRequest
7 голосов
/ 19 декабря 2009

Имея отсортированный список и некоторое случайное значение, я хотел бы найти, в каком диапазоне это значение.

Список выглядит так: [0, 5, 10, 15, 20] И значение, скажем, 8.

Стандартным способом будет либо идти от начала до тех пор, пока мы не достигнем значения, которое больше нашего (как в примере ниже), либо выполнить бинарный поиск .

grid = [0, 5, 10, 15, 20]
value = 8
result_index = 0
while result_index < len(grid) and grid[result_index] < value:
    result_index += 1

print result_index

Мне интересно, есть ли более питонический подход, так как этот, хотя и короткий, выглядит немного болезненным для глаз. Спасибо за ваше время!

Ответы [ 2 ]

20 голосов
/ 19 декабря 2009
>>> import bisect
>>> grid = [0, 5, 10, 15, 20]
>>> value = 8
>>> bisect.bisect(grid, value)
2

Edit:

пополам - алгоритм деления пополам

1 голос
/ 19 декабря 2009
for min, max in zip(grid, grid[1:]): # [(0, 5), (5, 10), (10, 15), (15, 20), (20, 25)]
  if max <= value < min: #previously: if value in xrange(min, max):
    return min, max
raise ValueError("value out of range")
...