Python排序和二进制搜索索引器错误:列表索引超出范围

Python排序和二进制搜索索引器错误:列表索引超出范围,python,indexing,Python,Indexing,我正在努力理解此代码中的错误: def arr_sort_binsearch(ar): ar.sort() first = 0 last = len(ar)-1 found = False item = 8 for num in ar: while first<=last and not found: midpoint = (fir

我正在努力理解此代码中的错误:

def arr_sort_binsearch(ar):

        ar.sort()

        first = 0
        last = len(ar)-1
        found = False
        item = 8

        for num in ar: 
            while first<=last and not found:
                midpoint = (first + last)//2
                if ar[midpoint] + num == item:
                    found = True
                else:
                    if item < ar[midpoint]:
                        last = midpoint-1
                    else:
                        first = midpoint+1
            print("{} and {} is: {}".format(num, ar[num], item))

ar = [1,3,5,7]
arr_sort_binsearch(ar)
def arr\u sort\u bin搜索(ar):
ar.sort()
第一个=0
最后一个=透镜(ar)-1
发现=错误
项目=8
对于ar中的num:

首先,我认为错误就在这句话中:

print("{} and {} is: {}".format(num, ar[num], item))
num不应是ar中的参数


干杯

我认为这句话的错误在于:

print("{} and {} is: {}".format(num, ar[num], item))
num不应是ar中的参数


干杯

如果您试图编写二进制搜索,则代码不正确

1、回答您的问题,为什么索引器:列表索引超出范围

输入列表
ar
上的循环代码为
num
,最后
print
,元素将是
ar[num]
的索引,这会引起错误,例如:

您有
ar=[1,2,3,4,5,8,9,11,6]
,当循环到
9
时,
print
尝试使用
ar[9]
,但列表中只有9个元素
ar
,超过最大索引
8
,这将导致
索引器:列表索引超出范围

2、您的二进制搜索可以修改如下:

def arr_sort_binsearch(ar,item):

    ar.sort()

    first = 0
    last = len(ar)-1
    found = False

    while first<=last and not found:
        midpoint = (first + last)//2
        if ar[midpoint] == item:
            found = True
        else:
            if item < ar[midpoint]:
                last = midpoint-1
            else:
                first = midpoint+1
    return found
def arr\u sort\u bin搜索(应收账款,项目):
ar.sort()
第一个=0
最后一个=透镜(ar)-1
发现=错误

首先,如果您尝试编写二进制搜索,则代码不正确

1、回答您的问题,为什么索引器:列表索引超出范围

输入列表
ar
上的循环代码为
num
,最后
print
,元素将是
ar[num]
的索引,这会引起错误,例如:

您有
ar=[1,2,3,4,5,8,9,11,6]
,当循环到
9
时,
print
尝试使用
ar[9]
,但列表中只有9个元素
ar
,超过最大索引
8
,这将导致
索引器:列表索引超出范围

2、您的二进制搜索可以修改如下:

def arr_sort_binsearch(ar,item):

    ar.sort()

    first = 0
    last = len(ar)-1
    found = False

    while first<=last and not found:
        midpoint = (first + last)//2
        if ar[midpoint] == item:
            found = True
        else:
            if item < ar[midpoint]:
                last = midpoint-1
            else:
                first = midpoint+1
    return found
def arr\u sort\u bin搜索(应收账款,项目):
ar.sort()
第一个=0
最后一个=透镜(ar)-1
发现=错误

首先,你能提供一个使它失败的输入吗?为什么你要在所有元素上循环,也要循环寻找一些值?为了改进你的问题,你应该包括一段显示你的问题的完全可运行的代码(我指的是一些调用你的函数的代码,一些适当的输入数据)并提供您收到的完整回溯错误。有了这些,您就更容易识别问题并提出解决方案。为什么要将
num
添加到
ar[middpoint]
ar[middpoint]
不是你想要测试的
项的值吗?你能提供一个使它失败的输入吗?为什么你要在所有元素上循环,也要循环寻找一些值?为了改进你的问题,你应该包括一段完全可运行的代码来展示你的问题(我的意思是一些代码调用您的函数一些适当的输入数据)并提供您收到的完整回溯错误。有了这些,您将更容易识别您的问题并提出解决方案。您为什么要将
num
添加到
ar[middpoint]
?不会
ar[middpoint]
是否是要针对
项测试的值?