为什么我会收到 "list assignment index out of range" 错误?
Why am I getting "list assignment index out of range" error?
我不断收到同样的错误:
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
你的索引被颠倒了; outer 列表有 16 个元素,但您试图索引 inner 列表超过那里的 8 个元素。
那是因为你的列表理解构建了 16 个列表,每 8 个值,所以 len(myList)
是 16,len(myList[0])
是 8。
反转范围:
for i in range(15):
for j in range(7):
myList[i][j] = 2 * i
或在尝试针对 myList
编制索引时反转 i
和 j
的使用:
for i in range(7):
for j in range(15):
myList[j][i] = 2 * i
请注意,外部 myList
现在正在使用 j
,并且每个嵌套的内部列表都使用 i
.
进行索引
i
和j
都省略了最后一个元素,如果不是故意的,使用8
和16
而不是 7
和 15
.
列表理解
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
函数中使用了16
和8
,因为它默认从0开始迭代直到传递给它的参数 - 1。因此,分别为 0 到 15 和 0 到 8。
我不断收到同样的错误:
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
你的索引被颠倒了; outer 列表有 16 个元素,但您试图索引 inner 列表超过那里的 8 个元素。
那是因为你的列表理解构建了 16 个列表,每 8 个值,所以 len(myList)
是 16,len(myList[0])
是 8。
反转范围:
for i in range(15):
for j in range(7):
myList[i][j] = 2 * i
或在尝试针对 myList
编制索引时反转 i
和 j
的使用:
for i in range(7):
for j in range(15):
myList[j][i] = 2 * i
请注意,外部 myList
现在正在使用 j
,并且每个嵌套的内部列表都使用 i
.
i
和j
都省略了最后一个元素,如果不是故意的,使用8
和16
而不是 7
和 15
.
列表理解
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
函数中使用了16
和8
,因为它默认从0开始迭代直到传递给它的参数 - 1。因此,分别为 0 到 15 和 0 到 8。