2013-07-14 67 views
6

我想初始化一個多維列表。基本上,我想要一個10x10網格 - 一個包含10個項目的10個列表的列表。Python:初始化多維列表

每個列表值應被初始化爲整數0

最顯而易見的方法在一個班輪做到這一點:myList = [[0]*10]*10不會工作,因爲它產生的10篇參考文獻列表,以一個列表,以便改變任何行中的項目都會在所有行中進行更改。

我見過的文檔談到了使用[:]複製一個列表,但在使用乘法器時仍不起作用:myList = [0]*10; myList = myList[:]*10myList = [[0]*10]*10具有相同的效果。

創建myList.append() s循環的缺點,有沒有一種快速有效的方式來初始化一個列表以這種方式?

+0

我認爲'[:]'想法也可以工作,例如, '[x [:] for [in [[0] * 10] * 10]'。 – DSM

回答

14

你可以理解非常有效地做到這一點:

a = [[0] * number_cols for i in range(number_rows)] 
+1

不錯,避免嵌套for循環顯而易見的答案,但只適用於你希望數組初始化的值可以被多次引用,所以如果你想讓數組填充一個類的唯一實例,那麼就不行。 – Perkins

+0

這是正確的。很高興你提起這件事。 – cheeyos

+0

完美。很棒。謝謝! – fdmillion

7

這是一個工作...嵌套列表理解!

[[0 for i in range(10)] for j in range(10)] 
+1

我相信這更清晰,*一般*更好的選擇(如使用'[0] * 10')。 – ZX9

0

你實際上可能需要一個array,而不是某些列表。幾乎每次我看到這個「presized嵌套列表」模式,都有些不對勁。

2

只是想我會添加一個答案,因爲問題要求爲一般的n維情況,我不認爲這是答案呢。您可以通過以下示例遞歸執行任意數量的維度:

n_dims = [3, 4, 5] 

empty_list = 0 
for n in n_dims: 
    empty_list = [empty_list] * n 

>>>empty_list 
>>>[[[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, 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

這與問題中描述的問題相同 - 它創建了許多對同一列表的引用。 –