Python二等分列表

时间:2011-11-01 22:26:37

标签: python bisect

我需要编写一个带有列表并将其一分为二的函数(比如bisect模块,但我不能使用它)。我通常会展示到目前为止我所做的事情,但我真的不知道如何在没有模块的情况下这样做,所以我希望有人可以帮助我。以下是我需要弄清楚的确切问题:

编写一个名为bisect的函数,它接受一个排序列表和一个目标值,并返回列表中值的索引(如果它在那里),如果它不是

则返回None

2 个答案:

答案 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) 

如果一位大师可以帮助我纠正这个缺陷也会很棒,谢谢,