列表索引超出Python范围;迭代

时间:2014-08-30 23:58:45

标签: python

我正在使用下面的简单程序来查看迭代过程需要多长时间才能终止。但是,在第15行,我无法弄清楚为什么我会得到索引输出范围错误。

我想要计算的一个例子是下面的示例迭代所需的步骤数:用户输入4然后是1234.然后我们得到:[1,2,3,4] - > [1,1,1,1] - > [0,0,0,0]然后终止。到达[0,0,0,0]需要2个步骤。我已经证明,对于我插入的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)

2 个答案:

答案 0 :(得分:2)

Game = Iteration可能就是原因。当j = 1时,游戏将是一个仅包含一个项目的列表。然后,Game [1] -Game [2]将超出范围。

答案 1 :(得分:1)

您的代码是以非Pythonic样式编写的,表明您直接从C代码进行翻译。 (另外,你基本上不应该使用input();它不安全,因为它会评估用户输入的任意Python代码!请改用raw_input()。)

如果你用更多的Pythonic风格重写它,那么问题就变得清晰了:

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循环中。