2012-02-27 77 views
15

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

回答

31

這不符合你的希望。

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

5

之所以爲什麼你有清單,只是重複了四次!每次您執行*4時,Python都不會重新生成該列表。它使用相同的列表對象。

要解決這個問題,你需要的力蟒每次regenrate該名單爲您提供:

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

在這種情況下,我用一個列表理解。

0

爲什麼Python初始化每個數組的第一個值而不是第一個值?

因爲它們是相同的數組,引用多次。

有沒有更好的方法來完成我想要做的事情?

創建一個結構,使得外數組引用單獨的內部數組而不是重用它。其他答案提供了這樣做的方法。

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) } 

then q[0][1]=5會分配一個時間只能 嘗試

print(q) 
2
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]] 
0

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

q[0] = [5,None,None,None,None] 
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]]