2009-12-11 69 views
2
* N名單

我想在Python中創建一個3維n ňñ列表,像這樣:問題創造N * N在Python

n=3 
l = [[[0,]*n]*n]*n 

不幸的是,這似乎不正確「克隆」的名單,因爲我認爲它會:

>>> l 
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]] 
>>> l[0][0][0]=1 
>>> l 
[[[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]]] 

我在做什麼錯在這裏?

+0

如果你期望做很多矩陣運算,你可以進入'numpy',但我喜歡使用由元組索引的字典作爲多維數組:'from collections import defaultdict; d = defaultdict(int); d [0,0,0] = 1' - 它可能非常適合你的3D井字遊戲。 – 2012-07-26 00:44:39

回答

5

問題是* n做了一個列表的淺表副本。解決方案是使用嵌套循環,或嘗試numpy庫。

2

這不是克隆列表。它一遍又一遍地插入對同一個列表的引用。嘗試使用一組嵌套的for循環創建列表。

3

正如其他人所提到的,它正在建立第二層和第三層的引用,而不是克隆。嘗試:

>>> n = 3 

>>> l = [[[0]*n for _ in xrange(n)] for _ in xrange(n)] 

>>> l[0][0][0] = 1 

>>> l 
[[[1, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]] 

或者,如果你想輸入一個少一點:

>>> l = [[[0]*n for _ in '.'*n] for _ in '.'*n] 
4

如果你想要做的數值處理與3-d矩陣你是使用numpy的更好。這是很容易:

>>> import numpy 
>>> numpy.zeros((3,3,3), dtype=numpy.int) 
array([[[0, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0]], 

     [[0, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0]], 

     [[0, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0]]]) 
>>> _[0,0,0] 
0 
2

我有什麼第二萊昂納多 - santagada建議,增加的是創建N個維數組/列表是非常unpythonic,你應該重新考慮你如何保持你的數據,如果看在類別或詞典列表(或列表字典)中不屬於更好的類別。

+0

謝謝你指出這一點。我需要這個爲AI算法創建一個三維井字棋板。儘管numpy數組可能加快了某些操作,但我認爲這對於這個小程序來說「足夠好」。 – 2009-12-18 19:03:48