我有一份清单。我创建它后,print list
的结果是:
[1, 3, 5, 60, 72, 83, 120, 180]
然后将其作为参数传递给函数。在该函数的第一行(未对列表进行任何更改),它将传递给另一个函数。在此处打印列表会产生以下结果:
[1, 3, 5, 60, 72, 83, 120, 180]
[]
同样,这是在完成任何其他事情之前。第二个功能是:
def median(li):
print li
lenli = len(li)
if lenli%2==0:
i = (((lenli/2) + (lenli/2 + 1)) / 2)
print i
return li[i]
else:
return l[lenli/2 - 1]
程序到达return li[i]
后,会抛出此错误:
IndexError:列表索引超出范围
任何想法我做错了什么?我已经尝试访问列表中的其他元素(0,1)并且仍然抛出相同的错误。
编辑: 第一个功能是:
def binarysearch(target, tosearch):
print tosearch
i = median(tosearch)
while(i != target):
if i < target:
del tosearch[i:len(tosearch)]
else:
del tosearch[0:i]
i = median(tosearch)
return True
EDIT2
示例输入是这个数字列表[1, 3, 5, 60, 72, 83, 120, 180]
,作为源列表,int 5
作为目标。然后,median()
的第一次调用应返回72
,然后返回binarysearch()
中调用的每个缩短列表的中位数。最终binarysearch()
应返回True。
答案 0 :(得分:1)
我查了你的代码。并做了一些小修改:
def median(li):
if not len(li)%2:
i = (((len(li)/2) + (len(li)/2 + 1)) / 2)
return i, li[i]
else:
return i, li[len(li)/2 - 1]
def binarysearch(target, tosearch):
while True:
idx, med = median(tosearch)
if med == target:
return True
elif med < target:
tosearch = tosearch[idx:]
elif med > target:
tosearch = tosearch[:idx]
l = [1, 3, 5, 60, 72, 83, 120, 180]
print binarysearch(5, l)
结果:
>>>
True
我不打算修复代码的各个方面,但这应该会让你朝着正确的方向前进。祝你好运。