¿Cómo crear listas anidadas en python?

Sé que puedes crear listas fácilmente anidadas en python como esto:

[[1,2],[3,4]] 

¿Pero cómo crear una matriz de ceros de 3x3x3?

 [[[0] * 3 for i in range(0, 3)] for j in range (0,3)] 

o

 [[[0]*3]*3]*3 

No parece correcto ¿No hay forma de crearlo simplemente pasando una lista de dimensiones a un método? Ex:

 CreateArray([3,3,3]) 

En caso de que una matriz sea realmente lo que está buscando, considere el paquete numpy.

http://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html#numpy.zeros

Esto te dará una matriz de ceros de 3x3x3:

 numpy.zeros((3,3,3)) 

También se beneficia de las características de conveniencia de un módulo creado para la computación científica.

Las comprensiones de listas son solo azúcar sintáctica para agregar expresividad a la inicialización de listas; en su caso, no los usaría en absoluto, y buscaría un simple bucle nested.

En un nivel completamente diferente: ¿cree que la matriz n-dimensional de NumPy podría ser un mejor enfoque?
Aunque puede usar listas para implementar matrices multidimensionales, creo que no son la mejor herramienta para ese objective.

NumPy aborda este problema

http://www.scipy.org/Tentative_NumPy_Tutorial#head-d3f8e5fe9b903f3c3b2a5c0dfceb60d71602cf93

 >>> a = array( [2,3,4] ) >>> a array([2, 3, 4]) >>> type(a)  

Pero si desea utilizar las listas nativas de Python como una matriz, los siguientes métodos de ayuda pueden ser útiles:

 import copy def Create(dimensions, item): for dimension in dimensions: item = map(copy.copy, [item] * dimension) return item def Get(matrix, position): for index in position: matrix = matrix[index] return matrix def Set(matrix, position, value): for index in position[:-1]: matrix = matrix[index] matrix[position[-1]] = value 

O use la función de nido definida aquí , combinada con la repetición (0) del módulo itertools:

 nest(itertools.repeat(0),[3,3,3]) 

Solo anida la syntax de multiplicación:

 [[[0] * 3] * 3] * 3 

Por lo tanto, es sencillo express esta operación utilizando pliegues.

 def zeros(dimensions): return reduce(lambda x, d: [x] * d, [0] + dimensions) 

O si desea evitar la replicación de referencia, por lo que la modificación de un elemento no afectará a ningún otro, en su lugar debe usar copias:

 import copy def zeros(dimensions): item = 0 for dimension in dimensions: item = map(copy.copy, [item] * dimension) return item