错误发生在行if data[l][0] == value:
def binary_pairs(data, value):
l = 0
h = len(data) - 1
while l < h and data[l]!= value:
m = (h + l) // 2
if data[m][0] == value:
l = m
elif data[m][0] < value:
l = m + 1
else:
h = m - 1
print("done")
if data[l][0] == value:
return l
else:
return -1
示例输入: [[“dead”,[“brian.txt”,“grail.txt”]], [“eunt”,[“brian.txt”]], [“spank”,[“grail.txt”]] ]
答案 0 :(得分:1)
我可以看到您的代码存在两个潜在问题:
在比较中同时使用data[l]
和data[l][0]
似乎很奇怪。
例如,如果l==0
和h==1
并且您最终获得了else
(h = m - 1
),那么您最终会得到{{1}超出界限。可能还有其他类似的问题。
答案 1 :(得分:0)
我现在无法运行您的代码,但这里有一些想法。
bisect
模块。http://docs.python.org/2/library/bisect.html
http://www.python.org/dev/peps/pep-0008/
让循环在找到值时立即返回索引会更清晰,而不是在顶部进行循环测试以确保尚未找到该值,从而导致循环结束然后是从函数底部返回的值。如果循环结束,您可以在函数末尾返回-1
。
您的循环检查索引是否为< h
,但不检查索引是否为>= 0
。我怀疑这可能是你的问题。
调试这样的循环时,添加记录正在发生的事件的print语句通常很有帮助。您应该打印索引的值,并打印足够的其他行以了解它是增加还是减少,以及减少多少。