2017-04-02 103 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 
相關問題