2017-04-02 78 views
1

我不知道为什么我收到以下错误:为什么我得到列表索引超出范围错误?

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 
+0

更重要的一点,这条线应该做什么*做*?您正在进行比较,但未分配结果。你的意思是赋值('=',而不是'==')? – jonrsharpe

+0

即使只是=,我也会得到同样的错误。 –

+0

嗯,是的;关键错误发生在比较或分配之前。但考虑'A == [2,-2,1]'的情况,当'a == 2'时。什么是'A [4]'?无论是在纸上写下你的例子还是使用例如http://pythontutor.com/visualize.html来逐步完成它。 – jonrsharpe

回答

0

您正在尝试把key(a)的一个索引列表Aakey(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]来处理循环的所有内容。

0

的原因是,您访问的列表A = [2,-2,1]与指数是你的名单A.

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

你必须确保你不与比列表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 
相关问题