我正在处理2D列表,并希望将处理后的2D列表存储在具有相同索引的新2D列表中。但是,我收到错误"列表索引超出范围"
我简化了代码以便于理解:
a = [
['a', 'b'],
['c', 'd']
]
print a
b = []
for i in range(len(a)):
for j in range(len(a[i])):
if a[0][0] == 'a':
a[0][0] = 'b'
else:
b[i][j] = a[i][j] #list index out of range
由于
答案 0 :(得分:1)
简单,您将b初始化为[],因此任何通过索引访问它的尝试都将超出范围。 Python中的列表可以动态增加大小,但这并不是你如何做到的。你需要.append
答案 1 :(得分:1)
我对你的预期输出一无所知。我刚刚修正了错误。
首先append
为空list
到b
,然后您可以访问b[i]
,依此类推。
代码:
a = [
['a', 'b'],
['c', 'd']
]
print(a)
b = []
for i in range(len(a)):
b.append([]) #Append an empty list to `b`
for j in range(len(a[i])):
if a[0][0] == 'a':
a[0][0] = 'b'
else:
b[i].append(a[i][j]) #No error now
print(b)
答案 2 :(得分:1)
在b[i][j]
,您尝试访问第i个元素的第j个元素。但是,b只是一个空列表,因此第i个元素不存在,更不用说第i个元素的第j个元素了。
您可以通过将元素附加到b来解决此问题。但首先,应为。
中的每个列表(行)创建一个列表(行)(附加到b)以下示例使用enumerate
函数。它返回索引和元素,所以如果你想要你仍然可以用i和j做东西,但这会阻止你获得IndexError
。您仍然可以安全地使用a[i][j]
,因为索引来自a
。
a = [
['a', 'b'],
['c', 'd']
]
b = []
for i, row in enumerate(a): # loop over each list (row) in a
b_row = [] # list (row) which will be added to b
for j, element in enumerate(row): # loop over each element in each list (row) in a
if a[0][0] == 'a': # Not sure why each the first element of a has to be checked each loop # Probably a simplification of the operations.
a[0][0] = 'b'
else:
b_row.append(element) # append the element to the list(row) that will be added to b
b.append(b_row) # When the row is filled, add it to b
print(b)
最后一条评论:不建议在Python中循环时更改列表(如if
语句中所述)。最好将这些更改应用于输出列表,即b。如果这是一个简化的过程,那就忽略这句话。