为什么我的列表索引超出范围错误?

时间:2017-04-02 09:41:19

标签: python

我不确定为什么会收到以下错误:

builtins.IndexError: list index out of range 

在以下行(第5行):

C[A[key(a)]] == C[A[key(a)]] + 1

此代码的输入示例为A = [2, -2, 1]key = lambda x: x**2,在第4-5行的循环中,它将A[a]项的键作为所选索引对于数组C,并将该索引处的值增加1。例如:C[A[key(0)]]C[4]0,并且会增加到1

def key_positions(A, key):
    k = key(max(A, key = key))
    C = [0] * (k+1)
    for a in A:
        C[A[key(a)]] == C[A[key(a)]] + 1
    for i in range(0, k):
        sum = C[i]
    return C

2 个答案:

答案 0 :(得分:0)

您正在尝试将key(a)视为列表A的索引。 akey(a)都不是[0, len(A)]范围内的有效索引。

如果您想计算key(a)的出现次数,只是直接使用作为C的索引:

def key_positions(A, key):
    k = key(max(A, key = key))
    C = [0] * (k+1)
    for a in A:
        C[key(a)] += 1
    for i in range(0, k):
        sum = C[i]
    return C

我在这里使用+=扩充作业,而不是更详细的C[key(a)] = C[key(a)] + 1;这样可以节省每次重复执行key()的功能。

计算最大k值也更简单:

k = max(key(a) for a in A)

接下来,使用sum = C[i]的循环也是荒谬的;由于您没有使用sum,因此循环是多余的,您可以使用sum = C[-1]来完成循环。

答案 1 :(得分:0)

原因是您使用超出列表A范围的索引访问列表A = [2,-2,1]。

对于第一个for循环的每次迭代, 你计算a的平方(通过你的关键lamba),这会导致索引错误。

您必须确保不访问索引值大于列表A大小的列表A.

例如:

for a in A: 
  # key(a) will be 4, 4, 1
  # but for key(2) it will be 4
  # and larger than the list A.
  C[A[key(a)]] == C[A[key(a)]] + 1