2014-08-30 71 views
-1

我正在使用下面的簡單程序來查看迭代過程終止多長時間。但是,在第15行中,我無法弄清楚爲什麼我得到索引超出範圍錯誤。列表索引在Python中超出範圍;迭代

我正在嘗試計算的一個示例是以下示例迭代所需的步驟數:用戶輸入4然後是1234.然後我們有:[1,2,3,4] - > [ 1,1,1,1] - > [0,0,0,0]然後終止。需要2個步驟才能到達[0,0,0,0]。我已經證明,對於我插入的n的值,系統最終會轉到[0,0,0,0]。

import math 
index = input("Enter length: ") 
n = int(index) 
game = input("Enter Coordinates of length n as a number: ") 
s = list(game) 
Game = [] 
for k in s: 
    Game.append(int(k)) 
    l = len(game) 
while sum(Game) > 0: 
    Iteration = [] 
    k = 0 
    j = 0 
    while j < l-1: 
     Iteration.append(math.fabs(Game[j]-Game[j+1])) # line 15 
     j = j+1 
     k = k+1 
     Game = Iteration 
print(k) 
+4

'Game = Iteration'可能是爲什麼。當j = 1時,遊戲將成爲僅有一個項目的列表。然後,遊戲[1] - 遊戲[2]將超出界限。 – 2014-08-31 00:01:30

+0

哦,我明白了爲什麼!我沒有在迭代中添加所有我想要的術語。謝謝! – 2014-08-31 00:05:21

+0

我寫了一個答案。如果這解決了您的問題,請標記爲正確!謝謝! – 2014-08-31 00:25:36

回答

2

Game = Iteration可能是爲什麼。當j = 1時,遊戲將成爲僅有一個項目的列表。然後,遊戲[1] - 遊戲[2]將超出界限。

+0

換句話說,'list'變量'Game'在每次傳遞中越來越短,但他沒有通過改變'l'來解釋這個。 [我的答案中的更多詳細信息](http://stackoverflow.com/a/25587962/20789)。 – 2014-08-31 00:35:10

1

您的代碼編寫的風格非常非Pythonic,表明您直接從C代碼進行翻譯。 (!此外,您應該基本上不會使用input();這是不安全的,因爲它計算任意用戶輸入的Python代碼使用raw_input()代替)

如果你在一個更Python風格重寫它,它變得清晰的問題是什麼:

import math 

# you don't do anything with this value, but okay 
s = index = int(raw_input("Enter length: ")) 

# game/Game naming will lead to confusion in longer code 
game = raw_input("Enter Coordinates of length n as a list of comma-separated numbers: ") 
Game = [int(k) for k in game.split(',')] 
l = len(Game) 

while sum(Game) > 0: 
    Game = [math.fabs(Game[j]-Game[j+1]) for j in range(l-1)] # problem here 

# no idea what k is for, but it's not used in the loop anywhere 

的問題是,通過你的內心while循環來實現,或行標在我的版本# problem here,您Game列表獲取一個元素短!因此,在第二次通過外部while循環時,它會讀取Game末尾的元素。

我不知道這段代碼試圖做什麼,所以我不能真正提出修復方案,但如果您真的打算縮短每次通過的列表,那麼您當然需要考慮它的更短的長度將l=len(Game)放入while循環中。