我正在尝试创建二进制搜索功能,我已尝试使用下面的代码,但我是python的初学者;我收到错误"列表索引必须是整数,而不是str"在i == alist[i]
行。你能帮我解决一下这个问题吗?这是整个代码:
def bsort(alist, i):
left = 0
right = len(alist)-1
i == alist[i]
[mid] = (left + right)//2
if alist[mid] < i :
left = [mid] + 1
elif alis[mid] > i :
right = [mid] + 1
elif alist[mid] == i :
print ("word found at", i )
elif left > right:
print ("Not Found!")
i = input("Enter a search >")
alist = ["rat","cat","bat","sat","spat"]
bsort(alist, i)
答案 0 :(得分:1)
你得到'列表索引必须是整数,而不是str',因为你在列表中使用字符串作为二进制搜索的输入,在第4行使用它作为列表的索引,导致列表中的错误通过整数索引。
另一个问题: 1.在应用二进制搜索之前,必须对列表进行排序, 2.line 6导致另一个错误,因为int对象不可迭代。 3.为了在列表中进行完整的搜索,你必须包含一个while循环,它将感知前两个条件并帮助循环遍历列表。
这段代码可以帮到你:
def bsort(alist,blist,i):
msbuild ..\something.sln /p:Configuration=Release /p:DeployOnBuild=true /p:PublishProfile=Filesystem /p:publishUrl=$publishPath
i =输入(“输入搜索&gt;”)#string你想搜索 alist = [“rat”,“cat”,“bat”,“sat”,“spat”] blist = alist [:]#创建另一个列表,以了解原始列表中的元素索引 alist.sort()#排序列表执行二进制搜索 bsort(ALIST,blist,i)的
答案 1 :(得分:0)
首先它是==
,它检查相等性并且不分配值。使用single =代替==
进行分配。
此外,您的方法将i作为字符串,然后使用字符串来引用列表的索引。这会产生错误。
您正在使用二分搜索的整数方法来查找不正确的字符串。特别是因为您的字符串既不按长度排序,也不按字母顺序排序。请参阅其他一些方法来执行此操作。
答案 2 :(得分:0)
因此,从您的问题的声音,您正试图获得二进制搜索为您的示例工作。首先,知道二进制搜索仅在排序数据上可靠地工作是有用的。这与标准线性搜索完全不同,标准线性搜索总是会找到值,而不管顺序如何。您可能已经知道二进制搜索是首选,因为它每次迭代消除了一半的潜在候选者,而线性搜索只消除了一个元素。话虽如此,让我们讨论一下我对你的程序所做的修改。首先,一些外观变化可以大大提高程序的清晰度。
1。)使用描述性变量名称非常重要,可以作为读取代码的其他人的注释,以及变量的内容和功能。这在像python这样的语言中尤其重要,因为只需通过读取代码就不容易推断变量类型。因此,我没有多次重复使用变量i
,而是重命名了函数参数target
,因为这是我们尝试定位的搜索词,即我们的“目标”。我还从'bsort'重命名了你的函数,这意味着函数将某些内容排序为'bsearch',这是一个更合适的名称,因为它更准确地描述了函数的作用。
2.。)可以使用循环或递归来实现二进制搜索。为简单起见,我使用循环选择了迭代路由。正如我之前提到的,二进制搜索通过在每次迭代中消除一半潜在搜索候选者来工作。没有循环,你确实消除了一半的候选人(只有一次),但除非你非常幸运,否则你可能找不到你要搜索的术语!相反,您需要继续此过程,直到找到要搜索的术语为止。这是while True:
循环的功能。
3.)最后,我们确保使用整数来访问列表的索引。 python中的所有列表都是从0 to n-1
索引的,其中n
是列表中元素的数量。我们无法使用浮点值(例如2.5)访问列表,因为这与列表中的任何特定“槽”都不对应。类似地,我们不能使用字符串来访问我们的元素,因为列表再次需要一个整数来执行查找。这是mid = int((left + right)/2)
的目的。
尽管如此,这应该适用于您的预期目的。我希望这可以帮助你!我还鼓励您查看一些如何实现二分搜索的示例,例如this one。
def bsearch(alist, target):
left = 0
right = len(alist)-1
while True:
mid = int((left + right)/2)
if alist[mid] < target :
left = mid + 1
elif alist[mid] > target :
right = mid + 1
elif alist[mid] == target :
print ("word '" + target + "' found at " + str(mid))
break
elif left > right:
print ("Not Found!")
break
i = input("Enter a search >")
alist = ["rat","cat","bat","sat","spat"]
alist.sort()
bsearch(alist, i)