Python:列表索引超出范围(将2D列表分配给另一个2D列表)

时间:2016-10-11 13:35:53

标签: python arrays list

我正在处理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

由于

3 个答案:

答案 0 :(得分:1)

简单,您将b初始化为[],因此任何通过索引访问它的尝试都将超出范围。 Python中的列表可以动态增加大小,但这并不是你如何做到的。你需要.append

答案 1 :(得分:1)

我对你的预期输出一无所知。我刚刚修正了错误。 首先append为空listb,然后您可以访问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。如果这是一个简化的过程,那就忽略这句话。