列表赋值索引超出Python范围

时间:2015-03-13 17:55:45

标签: python

n=int(input())
m=int(input())
a=[n+1]
for i in range(n+1):
    a[i]=0
a[0]=a[1]=1
for i in range(n+1):
    a[i]=a[i-1]+a[i-2]
for i in range(n+1):
    sum+=a[i]*a[i]
print((sum+1)%m)

        a[i]=0

IndexError: list assignment index out of range

你能帮帮我吗?列表分配索引超出范围。我无法解决。

2 个答案:

答案 0 :(得分:1)

Java等语言要求您创建特定长度的数组。 Python允许您初始化列表,无论是空的还是填充的,然后您只需将项目附加到列表中即可。如果要创建长度为a的列表n+1,每个元素中包含0,则可以使用列表解析来执行此操作:a = [0 for item in range(n+1)]

您不应该使用sum作为变量,因为sum是Python内置函数。但是,如果您确实选择覆盖内置函数,则必须先为其指定一些内容。使用sumsum+=a[i]*a[i]添加一个数字会尝试将a[i]的平方添加到一个无法正常工作的函数中。

请记住,当a[i-2]小于2时,Python列表中的负编号索引与i一样,从列表末尾开始:mylist[-1]是列表中的最后一项,mylist[-2]是倒数第二项,依此类推。因此,列表中的第一项,即1,设置为最后一项和倒数第二项的总和,即0。第二项,也是1,设置为第一项的总和(现在a 0)和最后一项(仍为0),也是0.现在你的列表全为零。

我对代码产生错误的部分做了一些更改,并添加了注释,以便您可以看到每个部分的作用,给出合理的输入,例如n = 3和m = 5:

n=int(input())
m=int(input())
a=[0 for item in range(n+1)] # initialize all to 0
mysum = 0 # initialize a sum that doesn't override the builtin
a[0]=a[1]=1 # set first 2 elements to 1
for i in range(n+1): # for every item in a,
    a[i]=a[i-1]+a[i-2] # this ends up setting everything to 0
for i in range(n+1): # for every item in a,
    mysum+=a[i]*a[i] # add 0*0 to the sum
print((mysum+1)%m) # 1 modulo anything greater than 1 is 1, so this prints 1

所以这个程序不仅仅是打印1

答案 1 :(得分:0)

# Get input values
n = 10
m = 100

# Initialize list
fib = [1,1]
# Fibonacci sequence of length n
for i in range(2,n): # Adjust the number of iterations to your problem
    fib.append(fib[-1]+fib[-2])

# List comprehension for creating the "squares" list and getting its sum
result = sum([fib[i]**2 for i in range(len(fib))]) % m

print fib
print result