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
行。有趣的是,当我注释掉那一行并且只是让循环打印索引时,它就完成了循环。是什么赋予了?提前致谢。
答案 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