执行二进制搜索时列出索引超出范围错误

时间:2018-07-15 21:49:18

标签: python list while-loop

我试图创建一个函数,该函数接受有序的数字和给定数字的列表,并确定给定数字是否在列表内。我正在尝试使用二进制搜索来完成此任务。

我有两个步骤:

首先,通过仅提取list1中小于给定数字的数字,然后将这些数字附加到称为list1的新列表中,来缩小newlist

接下来,在while循环中,我基本上将所有小于newlist中间数字的数字都删除并删除它们,重复此过程多次直到只有newlist中的一个数字。从那里,我会将那个数字与给定的数字进行比较。我的代码如下所示。

list1 = [1, 3, 5, 6, 8, 14, 17, 29, 31]
number = 7

def func(list1, number):
    newlist = []
    for x in list1:
        if x < number:
            newlist.append(x)
        else:
            continue

    while len(newlist) > 1:
        for x in range(0, len(newlist) - 1):
            if newlist[x] < newlist[round(len(newlist) / 2)]:
                newlist.remove(newlist[x])
            else:
                continue

    if newlist[0] == number:
        return True
    else:
        return False

print(func(list1, number))

我在第36行(if newlist[x] < newlist[round(len(newlist) / 2)]:)收到错误,列表索引超出范围。我认为问题在于,随着newlist越来越小,x设置的range(0, len(newlist) - 1)值保持不变?如果是这样,我不确定如何补救。提前非常感谢。

1 个答案:

答案 0 :(得分:0)

问题就在这里:

void HidDevice::do_some_checks() /* do some checks... */
{
    if ( some checks )
    {
        if ( other checks )
            m_bEarlyExit = true;

        this->cv.notify_one();
    }
}

首先,您要遍历列表

for x in range(0, len(newlist) - 1):
    if newlist[x] < newlist[round(len(newlist) / 2)]:
        newlist.remove(newlist[x])

此列表是在您开始循环时生成的 ,这意味着如果[0, 1, 2, ..., len(newlist) - 1] 开头为7,则无论是否从列表中删除内容,该列表将始终上升到6。 len(newlist),稍后再做。这就是导致您出错的原因,因为在某个时候您已经删除了足够多的元素,使得列表现在增加了三个元素,但是python试图访问第五个元素,因为要迭代的列表不是{{1 }},即newlist

要解决此问题,您可以(例如)将for循环替换为此:

newlist

从本质上讲,这是在python中执行C或Java风格的[0, 1, 2, 3, 4, 5, 6]循环的方式,并且可以避免此类问题。

我还理解您的代码中的逻辑有问题,上面的注释之一指出了这一点,并且使您更深入地了解了潜在问题的本质,但这至少是为什么会出现此错误的解释首先发生,所以也许对以后有帮助