为什么我的代码中的列表索引超出范围错误?

时间:2013-09-15 17:59:34

标签: python-3.x

错误发生在行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”]]     ]

2 个答案:

答案 0 :(得分:1)

我可以看到您的代码存在两个潜在问题:

  • 在比较中同时使用data[l]data[l][0]似乎很奇怪。

  • 例如,如果l==0h==1并且您最终获得了elseh = m - 1),那么您最终会得到{{1}超出界限。可能还有其他类似的问题。

答案 1 :(得分:0)

我现在无法运行您的代码,但这里有一些想法。

  • 如果您尝试解决问题,而不是尝试学习编写二进制搜索,请考虑使用Python的bisect模块。

http://docs.python.org/2/library/bisect.html

  • Python中的最佳实践是遵守称为PEP 8的编码标准;建议不要使用小写字母L作为变量名称,或使用大写字母I.

http://www.python.org/dev/peps/pep-0008/

  • 让循环在找到值时立即返回索引会更清晰,而不是在顶部进行循环测试以确保尚未找到该值,从而导致循环结束然后是从函数底部返回的值。如果循环结束,您可以在函数末尾返回-1

  • 您的循环检查索引是否为< h,但不检查索引是否为>= 0。我怀疑这可能是你的问题。

  • 调试这样的循环时,添加记录正在发生的事件的print语句通常很有帮助。您应该打印索引的值,并打印足够的其他行以了解它是增加还是减少,以及减少多少。