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

时间:2012-02-27 02:26:49

标签: python arrays list

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

q = [[None]*5]*4

我想将5的值分配给q第一列的第一行。本能地,我做了以下几点:

q[0][0] = 5

但是,这会产生:

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

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

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

7 个答案:

答案 0 :(得分:47)

这不符合您的期望。

q = [[None]*5]*4

它多次重用list个对象。正如您所看到的那样,您对一个单元格进行了更改,该单元格位于重用的列表对象中。

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

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

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

可能更多你正在寻找的东西。

这明确避免重用列表对象。

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

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

也会奏效。您不能从预定义的None值网格开始。但是首先需要它们是罕见的。

在Python 2.7及更高版本中,您可以这样做。

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

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

{(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}

答案 1 :(得分:8)

你之所以有这个清单,只是重复了四次!每次执行*4时,Python都不会重新生成该列表。它使用相同的列表对象。

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

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

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

答案 2 :(得分:4)

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)

结果:

[[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]]

答案 3 :(得分:1)

答案很简单从不使用

q = [[None]*5]*4

与分配时一样

q[0][1]=5它将值多次分配给1列的多行 尝试打印(q)

宁愿使用

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

然后q[0][1]=5将只分配一次 试试

print(q)

答案 4 :(得分:0)

  

为什么Python初始化每个数组的第一个值而不仅仅是第一个?

因为它们是同一个数组,所以多次引用。

  

有没有更好的方法来完成我想要做的事情?

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

问题2的答案: 使用numpy是一种选择。请参阅以下代码。

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)

结果:

[[ nan  nan  nan]
 [ nan  nan  nan]
 [ nan  nan  nan]
 [ nan   5.  nan]
 [ nan  nan  nan]]