2015-04-04 36 views
1

我不断收到同样的错误:为什么我会得到“列表分配索引超出范围”错误?

Traceback (most recent call last): 
    File "<stdin>", line 3, in <module> 
IndexError: list assignment index out of range 

有什么不对下面的代码?

myList = [([None] * 8) for x in range(16)] 

for i in range(0,7): 
    for j in range(0,15): 
     myList[i][j] = 2 * i 
+0

只记得范围(a,b)实际上是从a到b-1,而不是a到b。 – jazzz 2015-04-05 05:55:13

回答

1

列表内涵

myList = [([None] * 8) for x in range(16)] 

可以理解这样

mylist = [] 
for x in range(16): 
    mylist.append([None] * 8) 

所以,你正在创建的16名名单列表,每个包含8 None秒。但与循环

for i in range(0,7): 
    for j in range(0,15): 

您试图从前7个列表访问15个元素。这就是它失败的原因。相反,你可能想要做

for i in range(16): 
    for j in range(8): 
     ... 

其实你可以做列表理解一样,这样

[[2 * i for j in range(8)] for i in range(16)] 

演示:

>>> from pprint import pprint 
>>> pprint([[2 * i for j in range(8)] for i in range(16)]) 
[[0, 0, 0, 0, 0, 0, 0, 0], 
[2, 2, 2, 2, 2, 2, 2, 2], 
[4, 4, 4, 4, 4, 4, 4, 4], 
[6, 6, 6, 6, 6, 6, 6, 6], 
[8, 8, 8, 8, 8, 8, 8, 8], 
[10, 10, 10, 10, 10, 10, 10, 10], 
[12, 12, 12, 12, 12, 12, 12, 12], 
[14, 14, 14, 14, 14, 14, 14, 14], 
[16, 16, 16, 16, 16, 16, 16, 16], 
[18, 18, 18, 18, 18, 18, 18, 18], 
[20, 20, 20, 20, 20, 20, 20, 20], 
[22, 22, 22, 22, 22, 22, 22, 22], 
[24, 24, 24, 24, 24, 24, 24, 24], 
[26, 26, 26, 26, 26, 26, 26, 26], 
[28, 28, 28, 28, 28, 28, 28, 28], 
[30, 30, 30, 30, 30, 30, 30, 30]] 

注:我有在range函数中使用168,因为它默认情况下为sta rts从0开始迭代直到传递给它的参数-1。因此,分别为0到15和0到8。

1

你有你的指数逆转; 外部列表有16个元素,但您试图索引列表中的8个元素之后的列表中的内部列表。

那是因为你的列表中理解每个构建8个值的16名名单,所以len(myList)为16,len(myList[0])为8

反向范围:

for i in range(15): 
    for j in range(7): 
     myList[i][j] = 2 * i 

或反向使用ij当试图对照索引时myList

for i in range(7): 
    for j in range(15): 
     myList[j][i] = 2 * i 

注意tha t外部myList现在使用j,并且每个嵌套的内部列表使用i索引。

两个ij省略的最后一个元素,如果不是故意的,用816,而不是715

相关问题