【问题标题】:Why is my for-loop index giving IndexError: list assignment index out of range? [duplicate]为什么我的 for 循环索引给出 IndexError: list assignment index out of range? [复制]
【发布时间】:2019-12-30 03:51:23
【问题描述】:

我试图让一个函数将一个数组和 int 作为输入,并在进行一些计算后返回一个相同长度的数组。

我对 Python 完全陌生,可能只是犯了一个非常明显的错误,但我无法自行解决。

错误消息说我超出范围,但我尝试缩短和扩大 for 循环的范围?

def WMA(element, duration):

    multiplier = 1 / duration

    z = [len(element)]
    z[0] = element[0] * multiplier

    for k in range(1, len(element) + 1):
        z[k] = (element[k] * multiplier) + (z[k - 1] * (1 - multiplier))
    return z

错误信息:

IndexError: list assignment index out of range

【问题讨论】:

  • z 只有一个元素,所以不能赋值给 z[k]。
  • ... in range(1, len(element) + 1) 然后element[k]。您最终将尝试访问element 的越界/越界成员。
  • Python(以及除 MATLAB、R 之外的大多数语言)从 0..(L-1) 而非 1..L 索引事物。因此range(1, len(element) + 1) 是错误的,你的意思只是range(len(element))
  • 问题与函数无关,我们不需要函数定义的行来重现问题。 (以后请只发MCVE (minimal, complete, verifiable example)
  • 您的行z = [len(element)] 没有多大意义,这肯定是z = [0] * len(element) 的拼写错误,这将创建一个指定长度的列表,正如其他人之前指出的那样。可能有人误解/错误转录了该代码。

标签: python indexing


【解决方案1】:

这一行应该可以解决它:

z = [0] * len(element)

及以后:

for k in range(1, len(element)):

正如罗纳德指出的那样。

【讨论】:

  • 啊哈!这行得通。只是将其更改为 len(element) 而不是 len(element) + 1 并不能完全解决我的问题,但将 z = [len(element)] 更改为 [0] * len(element) 也可以!感谢您的帮助(我在 MATLAB 方面有经验,并且能够使用该平台毫无问题地完成此任务,但我现在正在尝试扩展并学习 python)
【解决方案2】:

你有for k in range(1, len(element) + 1):

假设element 在其列表中有 N 个项目,因此len(element) == N。在 Python 中,列表的第一个元素是 element[0],最后一个元素是 element[N - 1]。但是你让 k 取值 1, 2, ... N。当 k 为 N 时,你会遇到 IndexError 异常。

您应该将语句更改为:

for k in range(1, len(element)):

【讨论】:

  • 不,我觉得应该是range(1, len(element)),因为0是在循环之前处理的。
  • @quamrana 对!
【解决方案3】:

试试这个:

你不需要在 for 循环的 range 函数中为 len(element) 添加 1,因为 range 将从 0 开始并上升到 len(element)-1,添加 1 将使其成为 IndexOutOfRange:

例如

    l = [1,2,3]

    print(len(l))

3


    for i in range(len(l)):
        print(i)


0
1
2

    for i in range(len(l)+1):
        print(i)


0
1
2
3

    for i in range(len(l)):
        print(l[i])


1
2
3

    for i in range(len(l)+1):
        print(l[i])


1
2
3

    Traceback (most recent call last):
      File "<pyshell#23>", line 2, in <module>
        print(l[i])
    IndexError: list index out of range

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    相关资源
    最近更新 更多