当传递给函数/列表索引超出范围时,列表会获得额外的元素

时间:2013-05-27 09:35:37

标签: python list function

我有一份清单。我创建它后,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。

1 个答案:

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

我不打算修复代码的各个方面,但这应该会让你朝着正确的方向前进。祝你好运。