2013-07-14 63 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

这与问题中描述的问题相同 - 它创建了许多对同一列表的引用。 –