很难找到这个问题的标题,所以让我来描述一下这个问题。我有一个严格单调递增浮点值的列表,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
然而,我觉得必须有一种更简单的方法。如何缩短,更容易?
答案 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