Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python对分列表_Python_Bisect - Fatal编程技术网

Python对分列表

Python对分列表,python,bisect,Python,Bisect,我需要编写一个函数,它接受一个列表并将其平分(就像平分模块一样,但我不能使用它)。我通常会展示我到目前为止所做的事情,但如果没有模块,我真的不知道怎么做,所以我希望有人能帮我一点忙。下面是我需要弄清楚的确切问题: 编写一个名为bisect的函数,该函数接受一个已排序的列表和一个目标值,并返回列表中该值的索引(如果有),如果没有,则返回该值的索引。bisect模块跟踪列表,使其保持排序,而不必每次插入元素时都求助。您需要实现的方法只需要在排序列表中搜索 def bisect(sortedlist,

我需要编写一个函数,它接受一个列表并将其平分(就像平分模块一样,但我不能使用它)。我通常会展示我到目前为止所做的事情,但如果没有模块,我真的不知道怎么做,所以我希望有人能帮我一点忙。下面是我需要弄清楚的确切问题:


编写一个名为bisect的函数,该函数接受一个已排序的列表和一个目标值,并返回列表中该值的索引(如果有),如果没有,则返回该值的索引。

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)
这基本上是进行二进制搜索。
在递归循环的后续调用中,通过传递索引来跟踪原始列表的索引。

我正在做“思考python”第10章练习8中的作业,我厌倦了上面fred编写的代码。它似乎有一些错误。 1.计数器不适用于具有100k字符串的长列表 2.有时,对于我确定在列表中的事情,它不返回任何值

所以我稍微调整了一下:

这是我的版本:

它工作得非常好,它使用沼泽2.0中名为words.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) 
def对分(列表,x,计数器=0):
如果len(list)==0:
返回x,“不在列表中”
elif(len(list)==1):
中间=0
其他:
中间=整数(长(列表)/2)
如果x==列表[中间]:
返回计数器x“在列表中”
elif x<列表[中间]:
计数器+=0
返回二等分(列表[0:中间],x,计数器)
elif x>列表[中间]:
计数器+=中间
返回二等分(列表[中间+1:],x,计数器)

如果一位大师能帮我纠正这个缺陷,那也太好了,谢谢,

这是家庭作业吗?我想是的。这个问题有任何性能限制吗?如果没有,,如果你愿意,你可以使用线性搜索。很抱歉,我不了解blender,希望我能走上正确的道路,Greg,我不认为它有性能限制。我们只是问它是否是家庭作业,因为很少有人要求你在避免内置搜索的同时重新实现某些东西模块,除非是用来测试理解能力的家庭作业。你试过什么?你试的时候发生了什么?你知道对分模块应该做什么吗?您知道如何检查列表中的各个元素吗?对不起,我没有先阅读问题中的注释。我在这个网站上有点冲动,想回答任何问题,却不考虑提问的原因。让我们希望他通过看我的代码,然后编写自己的代码来学习。