将值分配给二维python数组中的单个单元格

Assign value to an individual cell in a two dimensional python array

本问题已经有最佳答案,请猛点这里访问。

假设我在python中有以下空的二维数组:

1
q = [[None]*5]*4

我想将EDOCX1的值〔0〕分配给q第一列的第一行。本能地,我会做以下事情:

1
q[0][0] = 5

但是,这会产生:

1
2
3
4
 [[5, None, None, None, None],
  [5, None, None, None, None],
  [5, None, None, None, None],
  [5, None, None, None, None]]

每个数组的第一个元素被初始化为5,我认为只有第一个数组的第一个元素才能得到更新。我有两个问题:

  • 为什么python要初始化每个数组的第一个值,而不仅仅是第一个值?
  • 有没有更好的方法来完成我想做的事情?

  • 这不符合你的期望。

    1
    q = [[None]*5]*4

    它多次重复使用list对象。正如您在对一个单元格进行更改时看到的,该单元格位于重用的列表对象中。

    使用值为[None]的单个列表五次。

    使用值为[[None]*5]的单个列表四次。

    1
    q = [ [ None for i in range(5) ] for j in range(4) ]

    可能更多的是你想要的。

    这样可以显式地避免重用列表对象。

    80%的时候,字典是你真正想要的。

    1
    2
    q = {}
    q[0,0]= 5

    也可以。您不需要从一个预先定义的None值网格开始。但一开始很少需要它们。

    在Python2.7及更高版本中,您可以这样做。

    1
    q = { (i,j):0 for i in range(5) for j in range(4) }

    这将构建一个由两个元组索引的网格。

    1
    {(0, 1): 0, (1, 2): 0, (3, 2): 0, (0, 0): 0, (3, 3): 0, (3, 0): 0, (3, 1): 0, (2, 1): 0, (0, 2): 0, (2, 0): 0, (1, 3): 0, (2, 3): 0, (4, 3): 0, (2, 2): 0, (1, 0): 0, (4, 2): 0, (0, 3): 0, (4, 1): 0, (1, 1): 0, (4, 0): 0}


    为什么你有这个列表,只是复制了四次!每次执行*4时,python不会重新生成该列表。它使用相同的列表对象。

    为了解决这个问题,您需要强制python每次重新生成该列表:

    1
    [ [None] * 5 for i1 in range(4) ]

    在这种情况下,我使用的是列表理解。


    1
    2
    3
    4
    5
    6
    7
    q = [[None]*5]*4
    print(q)
    q[1][1]=4
    print(q)
    q = [ [ None for i in range(5) ] for j in range(4) ]
    q[1][1]=4
    print(q)

    结果:

    1
    2
    3
    [[None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None]]
    [[None, 4, None, None, None], [None, 4, None, None, None], [None, 4, None, None, None], [None, 4, None, None, None]]
    [[None, None, None, None, None], [None, 4, None, None, None], [None, None, None, None, None], [None, None, None, None, None]]

    答案很简单,永远不要用

    1
    q = [[None]*5]*4

    当你做作业的时候

    q[0][1]=5它在1列为多行分配多次值。尝试打印(Q)

    宁愿用

    1
    q = { (i,j):0 for i in range(5) for j in range(4) }

    那么,q[0][1]=5只分配一次尝试

    1
    print(q)

    问题2的答案:使用numpy是一个选项。请参见以下代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import numpy as np

    # creating 2D array with nans
    num_of_rows = 5
    num_of_cols = 3
    a = np.full((num_of_rows, num_of_cols), np.nan)
    #for zero vals: a = np.zeros((num_of_rows, num_of_cols))

    # placing number 5 in row 3, col 1
    value = [5]
    position_row = 3
    position_col = 1
    # the put command below flattens the 2D array
    position = [int(num_of_cols * position_row + position_col)]
    np.put(a, position, value)

    结果:

    1
    2
    3
    4
    5
    [[ nan  nan  nan]
     [ nan  nan  nan]
     [ nan  nan  nan]
     [ nan   5.  nan]
     [ nan  nan  nan]]

    如果您想使用列表而不是其他人建议的词典,您可以使用:

    1
    q[0] = [5,None,None,None,None]


    Why is Python initializing the first value of every array and not just the first one?

    因为它们是相同的数组,被多次引用。

    Is there a better way to accomplish what I'm trying to do?

    创建结构,使外部数组引用单独的内部数组,而不是重用一个。其他答案提供了这样做的方法。