python抛出列表索引超出范围错误,即使if子句是故障安全的

时间:2014-08-25 19:06:49

标签: python

Python初学者。我正在尝试编写一个非常简单的函数,该函数计算由输入数组(或“List”)表示的表达式的近似数值导数。我已经在matlab中编写了这个函数并且它工作正常,但是python通过抛出索引错误让我感到困惑。这是我的尝试:

def diffr(h, myList = []):

    d = []; 

    for n in myList:
        if myList.index(n) > 0:
            print(myList.index(n))
            d_elem = (myList[n] - myList[n-1])/h
            d.append(d_elem)

    return d

我们的想法是从myList(n-1)中减去myList(n)并除以h,然后从列表中删除。我意识到在第一次迭代时,myList(n-1)将超出界限,这就是我将if子句用于检查该条件的原因。但python仅在5次迭代后抛出此错误:

IndexError:列表索引超出范围

指向d_elem行。有趣的是,当我注释掉那一行并且只是让循环打印索引时,它就完成了循环。是什么赋予了?提前致谢。

3 个答案:

答案 0 :(得分:3)

您正在切换使用列表的内容和列表的索引。您希望n成为索引,但for循环和myList.index(n)的使用都将其视为存储在列表中的值。

将您的循环更改为:

for n in range(1, len(myList)):

并且它将解决问题,因为n将仅从1到列表长度减去1的值。您甚至不需要if语句。

答案 1 :(得分:3)

只需使用枚举并使用从第二个元素开始的每个元素:

def diffr(h, myList):
    d = []
    for ind, n in enumerate(myList[1:],1): # first iteration n will be the second element and myList[ind-1]) will be the first
        d_elem = (n - myList[ind-1]) / h
        d.append(d_elem)
    return d

您无需指定myList = []作为参数,您将传入列表并使用list作为默认arg通常不是一个好主意“Least Astonishment” in Python: The Mutable Default Argument < / p>

for ind, n in enumerate(myList[1:],1)中,ind是每个元素的索引,我们添加1作为参数来指定从index 1开始,因此n将是myList[ind-1])

之前的一个元素

在您的代码中,您使用元素进行索引,因此如果您的列表包含4个元素且第一个数字为4或更大,您将尝试访问列表中不存在的索引处的元素并获取索引错误。

答案 2 :(得分:0)

当您以这种方式迭代列表时,n会从列表中生成精确值。例如,如果你有一个列表[520,380],你的n将是520,然后是380. list.index(380)将返回1,因为[1]在你的列表中是380的位置。当您打印myList.index(n)时,您将获得一个索引。但是,在下一行中,您使用的是列表中的值(比方说380),这就是您收到索引错误的原因。 list [380]根本就不存在。但是,当然,列表[list.index(380)]可以。

我建议你要么枚举(正如Padraic Cunningham在写这篇文章时所说的那样)或将索引存储在单独的变量中而使用它来代替你的n