我需要编写一个带有列表并将其一分为二的函数(比如bisect模块,但我不能使用它)。我通常会展示到目前为止我所做的事情,但我真的不知道如何在没有模块的情况下这样做,所以我希望有人可以帮助我。以下是我需要弄清楚的确切问题:
编写一个名为bisect的函数,它接受一个排序列表和一个目标值,并返回列表中值的索引(如果它在那里),如果它不是
则返回None答案 0 :(得分:1)
bisect模块跟踪列表,保持其排序,而不必在每次插入元素时求助。您需要实现的方法只需要在排序列表中搜索。
def bisect(sortedlist,targetvalue,firstindex=0,lastindex=None):
if(len(sortedlist)==0):
return None
if(len(sortedlist)==1):
if(sortedlist[0]==targetvalue):
return firstindex
else:
return None
center = int(round(len(sortedlist)/2))
if(sortedlist[center]==targetvalue):
return firstindex+center
if(targetvalue>sortedlist[center]):
return bisect(sortedlist[center+1:lastindex],targetvalue,center+1,lastindex)
else:
return bisect(sortedlist[0:center],targetvalue,firstindex,center-1)
这基本上是二进制搜索。 传递索引以跟踪递归循环中进一步调用的原始列表的索引。
答案 1 :(得分:1)
我正在从“think python”第10章练习8做作业,我厌倦了弗雷德写的上面的代码。它似乎有一些错误。 1.计数器不适用于100k字符串的长列表 2.对于我确定在列表中的内容,有时会返回None。
所以我稍微调整了一下:
这是我的版本:
它工作得非常好,它使用来自沼泽2.0的wordlist.txt的单词列表进行测试,该单词列表最初来自moby集合:113809of.fic
希望这可以帮助那些与二等分项目挣扎的人
def bisects (list,x,counter=0):
if len(list)==0:
return x,'is not in the list'
elif(len(list)==1):
middle = 0
else:
middle = int(len(list)/2)
if x == list[middle]:
return counter, x,'is in the list'
elif x < list[middle]:
counter +=0
return bisects(list[0:middle],x,counter)
elif x > list[middle]:
counter +=middle
return bisects(list[middle+1:],x,counter)
如果一位大师可以帮助我纠正这个缺陷也会很棒,谢谢,