【问题标题】:assignment in 2D array - Python二维数组中的赋值 - Python
【发布时间】:2021-12-31 16:29:03
【问题描述】:

我是 Python 新手。 我正在尝试在二维数组中分配一个变量,我只对第一维使用 For-loop,我自己分配的第二维:

A = [3, 4]
B = []

for i in range(len(A)):
B[i*2][0] = 5
B[i*2][1] = 6
B[i*2][2] = 7

B[i*2 +1][0] = 10
B[i*2 +1][1] = 10
B[i*2 +1][2] = 10

我期待看到矩阵 B[4][3]:

B[0] = [5, 6, 7]

B[1] = [10, 10, 10]

B[2] = [5, 6, 7]

B[3] = [10, 10, 10]

但我收到此错误:

Traceback (most recent call last):
File "E:\Python\assignment1_materials\ex1_student_solution.py", line 30, in <module>
B[i*2][0] = 5
IndexError: list index out of range

我做错了什么?

【问题讨论】:

    标签: python arrays arraylist variable-assignment


    【解决方案1】:

    在这种情况下,数组B 被初始化为一个空的一维数组。为了将其初始化为 4x3 数组,我们需要执行以下操作:

    B = [[0 for i in range(3)] for j in range(4)]
    

    如果我们不这样做,那么B[2][2] 之类的代码将无法工作,因为没有为这些索引分配内存。

    因此整个代码看起来像这样:

    A = [3, 4]
    B = [[0 for i in range(3)] for j in range(4)]
    
    for i in range(len(A)):
      B[i*2][0] = 5
      B[i*2][1] = 6
      B[i*2][2] = 7
    
      B[i*2 +1][0] = 10
      B[i*2 +1][1] = 10
      B[i*2 +1][2] = 10
    

    【讨论】:

    • @KellyBundy 对此感到抱歉,我现在已经修复了这个微小的错误。我之前所做的是声明B=[[0]*3]*4。但是,这是不正确的,因为 Python 为每一行创建了一个浅表列表,这导致了不正确的值分配。在此处阅读有关浅列表的更多信息:(docs.python.org/3/library/copy.html)。
    • @ShitijGovil [0] * 3 很好而且很平常,顺便说一句,只是外部重复有问题。
    • 感谢您的帮助!
    【解决方案2】:

    问题在于 B 是一个空列表。以在线为例,

    B[i*2][0] = 5
    

    您正在尝试为 B[0][0] 分配不存在的东西,因为 B 当前是 [](空)。有几种方法可以解决这个问题。

    1. 确保索引在那里以便稍后分配。也就是说,索引 B[0][0] 事先存在,然后您可以选择分配它。您可以通过将其初始化为:

      B = [[None]*4 for x in range(2*len(A))]

    B 看起来像

    [[None, None, None, None],
     [None, None, None, None],
     [None, None, None, None],
     [None, None, None, None]]
    

    然后您可以为其索引分配值。

    1. 另一种方法是偷懒。也就是说,当您要分配一个值时,然后继续附加到 B。(.append() 将创建一个新索引并将您的值分配给它)。

    它看起来像:

    for i in range(len(A)) : 
        tmp = []
        tmp.append(5)
        tmp.append(6)
        tmp.append(7)
        B.append(tmp)
    
        tmp = []
        tmp.append(10)
        tmp.append(10)
        tmp.append(10)
        B.append(tmp)
    

    【讨论】:

    • 感谢您的帮助!
    猜你喜欢
    • 2017-01-29
    • 2019-07-18
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多