值分配给在二维蟒蛇阵列的单个细胞
比方说,我有在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
,其中我认为第一的仅第一元件数组将得到更新。我有两个问题:
- 为什么Python初始化每个数组的第一个值而不是第一个?
- 有没有更好的方法来完成我想要做的事情?
这不符合你的希望。
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}
之所以为什么你有清单,只是重复了四次!每次您执行*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]]
1为字典作为基质。 – 2012-02-27 02:37:12
如果您分享导致80%的价值的研究,我会给你+1。 – 2012-02-27 02:38:46
这是帕累托原则。 http://en.wikipedia.org/wiki/Pareto_principle。 80%的时间,你只需要20%的数据结构。 – 2012-02-27 02:49:38