2015-08-27 3 views
0

Трудно найти название для этой проблемы, поэтому позвольте мне описать проблему. У меня есть список строго монотонных возрастающих значений с плавающей точкой, где 0 и 1 - верхняя и нижняя границы соответственно. Далее есть значение, и я хочу узнать, между каким двумя значениями действительное значение.Найти индекс записей в списке, где значение находится между

Рассмотрим следующий пример:

li = [0, 0.1, 0.2, 0.3, 0.5, 0.75, 0.9, 1.0] 

мне нужна функция, которая в основном возвращает индекс пары соответствия. Если значение находится в пределах от 0 до 0,1 (чтобы быть точным: 0 < = значение < 0,1), она должна возвращать 0. Примеры:

get_index(li, 0.3) = 3 
get_index(li, 0.05) = 0 
get_index(li, 0.9) = 6 

Мой текущий подход должен был бы пройти по списку, сохранить последний и текущий элемент и использовать счетчик. В принципе, вот так:

def get_index(li, val): 
    counter = 0 
    old_val = None 
    new_val = None 
    for item in li: 
     if new_val is None: 
      new_val = item 
       continue 
      old_val = new_val 
      new_val = item 
      if old_val <= val and val < new_val: 
       return counter 
     counter += 1 

Я чувствую, однако, что должен быть более простой способ. Как сделать это короче, проще?

+0

Почему 'get_index (li, 0.9)' будет 7? вы имели в виду 6? – Kasramvd

+0

@ Kasramvd: Нет, 7 является правильным, как 0,9 <0,9 и 0,9 <1,0. Это седьмая пара. –

+0

Что вы подразумеваете под «подходящей парой» точно? –

ответ

2

Вы хотите bisect:

>>> bisect.bisect_right(li, 0.3) - 1 
3 
>>> bisect.bisect_right(li, 0.05) - 1 
0 
>>> bisect.bisect_right(li, 0.9) - 1 
6 
1

Попробуйте это, но get_index(li, 0.9) будет 6

def get_index(l, v): 
    if 0<=v<=.1: 
     return 0 
    return l.index(v) 

>>>get_index(li, 0.3) 
3 
1

Это должно сделать трюк ..

def get_index(li, val): 
     return li.index(max(i for i in li if val >= i)) 
1

если ваш список всегда строго монотонный, простой и понятный код может быть следующим (канун n, если меньше pythonic, чем предыдущие ответы):

def get_index(li, val): 
    for index in range(len(li)-1): 
     if (li[index] <= val < li[index+1]): 
      return index 
    return len(li) # in case of val is greater than max value of the list 
Смежные вопросы