我正在使用下面的简单程序来查看迭代过程需要多长时间才能终止。但是,在第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)
答案 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
循环中。