2012-03-31 162 views
5

我在Python中初始化二維數組時遇到了問題。我想一個6x6的陣列,我做在Python中初始化二維數組

arr = [[None]*6]*6 

但是當我做:

>>> arr[1][2]=10 
>>> arr 
[[None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None]] 

通知我只設置1項,並在所有行的「複製」。怎麼了?我認爲它與它引用相同的列表有關,但我該如何解決這個問題?

我想通

for key, _ in algos.items(): 
    algoData[key] = [] 
    for i in range(0,6): 
     algoData[key].append([]) 
     for j in range(0,6): 
      algoData[key][i].append(None) 

的作品,但似乎很長,只是初始化一個空的6x6陣列,如果我想要一個10000x10000陣列,這將是非常低效的?

UPDATE

可我也初始化二維數組的字典?我有一本字典,如:

algos = { "FIFO": ..., "LRU": ..., "Random": ... } 

我想初始化像下面的字典:

algoData = { "FIFO": 2D arr, "LRU": 2D arr, "Random": 2D arr } 

回答

14

使用列表解析,你可以說:

arr = [[None for x in range(6)] for y in range(6)] 

然後,你將有arr[1][2] = 10工作如預期。然而,這不是一件很正常的事情。你打算使用嵌套列表來做什麼?可能有更好的方法。例如,使用numpy包處理數組變得更容易。

+0

我想存儲用於matplotlib的數據(一個3D表面圖) – 2012-03-31 08:20:32

+3

在這種情況下,我肯定會推薦numpy。如果你想看一個示例,它用在[這個例子](http://matplotlib.sourceforge.net/examples/animation/simple_3danim.html)中。節省工作;這是一個很棒的包裝。 – Cameron 2012-03-31 08:24:07

+0

所以我需要的線將只是'lineData = np.empty((dims,length))'? – 2012-03-31 10:37:06

15

@Cameron在提示您使用NumPy處理數值數據數組時是正確的。對於你的問題的第二部分,〜Niklas B.發現他的建議是使用defaultdict

未涉及的內容是爲什麼[[None]*6]*6行爲異常。

答案是[None]*6在它創建六個None個列表(像你期望的那樣),但[list]*6不使list六個獨立的副本 - 它使一個參考相同list六份。

習慣性Python有一個部分可以更好地解釋這一點:"Other languages have variables - Python has names"