值分配给在二维蟒蛇阵列的单个细胞

问题描述:

比方说,我有在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. 有没有更好的方法来完成我想要做的事情?

这不符合你的希望。

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} 
+0

1为字典作为基质。 – 2012-02-27 02:37:12

+1

如果您分享导致80%的价值的研究,我会给你+1。 – 2012-02-27 02:38:46

+2

这是帕累托原则。 http://en.wikipedia.org/wiki/Pareto_principle。 80%的时间,你只需要20%的数据结构。 – 2012-02-27 02:49:38

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

要解决这个问题,你需要的力蟒每次regenrate该名单为您提供:

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

在这种情况下,我用一个列表理解。

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

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

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

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

答案很简单,不要用

q = [[None]*5]*4 

当你做任务

q[0][1]=5它的多个时间多行1张 尝试打印(Q)分配值

,而使用作为

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

then q[0][1]=5会分配一个时间只能 尝试

print(q) 

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

如果你想用一个列表,而不是一本字典为他人建议您可以使用此:

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

质疑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]]