我试图创建一个函数,该函数接受有序的数字和给定数字的列表,并确定给定数字是否在列表内。我正在尝试使用二进制搜索来完成此任务。
我有两个步骤:
首先,通过仅提取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)
值保持不变?如果是这样,我不确定如何补救。提前非常感谢。
答案 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]
循环的方式,并且可以避免此类问题。
我还理解您的代码中的逻辑有问题,上面的注释之一指出了这一点,并且使您更深入地了解了潜在问题的本质,但这至少是为什么会出现此错误的解释首先发生,所以也许对以后有帮助