python抛出索引范围错误的列表,即使if子句失败

2024-03-29 10:42:34 发布

您现在位置: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)中减去myList(n-1),然后除以h,然后按列表往下走。我意识到在第一次迭代中,myList(n-1)将超出界限,这就是为什么我使用if子句来检查该条件。但是python只在5次迭代之后抛出这个错误:

索引器错误:列表索引超出范围

指向d_elem行。有趣的是,当我注释掉那一行并让循环打印索引时,它就很好地通过了循环。有什么好处?提前谢谢。你知道吗


Tags: 函数列表indexif表达式def错误数组
3条回答

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

将循环更改为:

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

它将解决这个问题,因为n只取从1到列表长度减1的值。你甚至不需要if语句。你知道吗

只需使用enumerate并从第二个元素开始使用每个元素:

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作为默认参数通常不是一个好主意“Least Astonishment” in Python: The Mutable Default Argument

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

在您的代码中,您使用元素来索引,因此,如果您的列表有4个元素,并且第一个数字是4或更大,那么您将尝试访问列表中不存在的索引处的元素,并立即出现索引错误。你知道吗

当您以这种方式遍历列表时,n从列表中产生精确的值。例如,假设您有一个列表[520,380],您的n将是520,然后是380。列表.索引(380)将返回1,因为[1]是列表中380的位置。打印myList.index(n)时,会得到一个索引。但是,在下一行中,您使用的是列表中的值(假设为380),这就是为什么会出现索引错误。列表[380]根本不存在。但是,当然,名单[列表.索引(380)]。你知道吗

我建议您要么使用enumerate(正如我在编写本文时Padraic Cunningham所说的那样),要么将索引存储在单独的变量中,并使用它来代替n

相关问题 更多 >