python:在float数组中查找范围内的值

时间:2015-10-24 22:10:11

标签: python floating-point intervals

我有以下排序的python列表,尽管可能出现多个值:

[0.0943200769115388, 0.17380131294164516, 0.4063245853719435, 
 0.45796523225774904, 0.5040225609708342, 0.5229351852840304, 
 0.6145136350368882, 0.6220712583558284, 0.7190096076050408, 
 0.8486436998476048, 0.8957381707345986, 0.9774325873910711, 
 0.9832076130275351, 0.985386554764682, 1.0]

现在,我想知道数组中特定值可能下降的索引:

例如,值0.25将落在索引2中,因为它介于0.173和0.40之间。我想我可以浏览列表并在for循环中执行此操作,但我想知道是否有更好的方法来执行此操作,这可能更具计算效率。我创建了一次这个数组,但必须执行很多查找。

2 个答案:

答案 0 :(得分:2)

>>> vals = [0.0943200769115388, 0.17380131294164516, 0.4063245853719435, 
 0.45796523225774904, 0.5040225609708342, 0.5229351852840304, 
 0.6145136350368882, 0.6220712583558284, 0.7190096076050408, 
 0.8486436998476048, 0.8957381707345986, 0.9774325873910711, 
 0.9832076130275351, 0.985386554764682, 1.0]

>>> import bisect
>>> bisect.bisect(vals, 0.25)
2

答案 1 :(得分:1)

如果您知道列表已经排序,则教科书解决方案是进行二进制搜索。保留两个索引边界,min和max。将它们初始化为0和len - 1.然后将mid设置为(min + max)/ 2.将index mid的值与目标值进行比较。如果它更小,则将min设置为mid + 1.如果它更大,则将max设置为mid - 1.重复直到找到该值或直到max< min,在这种情况下,您将在O(log(n))步骤中找到所需的索引。