查找值介于两者之间的列表条目的索引

时间:2015-08-27 21:41:17

标签: python list

很难找到这个问题的标题,所以让我来描述一下这个问题。我有一个严格单调递增浮点值的列表,0和1分别是上下边界。还有一个值,我想找出实际值在哪两个值之间。

考虑以下示例:

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

我需要一个基本上返回匹配对索引的函数。如果该值在0和0.1之间(确切地说:0 <= val&lt; 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
然而,我觉得必须有一种更简单的方法。如何缩短,更容易?

4 个答案:

答案 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 :(得分: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

答案 2 :(得分:1)

这应该可以解决问题..

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

答案 3 :(得分:1)

如果您的列表始终是严格单调的,则可以使用以下简单且可读的代码(即使比以前的答案更少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