Problema al crear N * N * N lista en Python
Pregunta
Estoy tratando de crear un 3 dimensiones N N N en Python, como por ejemplo:
n=3
l = [[[0,]*n]*n]*n
Desafortunadamente, esto no parece adecuada "clon" de la lista, como pensé que lo haría:
>>> 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]]]
¿Qué estoy haciendo mal aquí?
Solución
El problema es que * n
hace una copia superficial de la lista. Una solución es utilizar bucles anidados, o tratar la biblioteca numpy.
Otros consejos
Si desea realizar un procesamiento numérico con matriz de 3-D que es mejor de utilizar numpy. Es muy fácil:
>>> 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
Como otros han mencionado, es la construcción de la 2ª y 3ª niveles de referencias, no clones. Proveedores:
>>> 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]]]
O si desea escribir un poco menos:
>>> l = [[[0]*n for _ in '.'*n] for _ in '.'*n]
No es la clonación de la lista. Se inserta una referencia a la misma lista una y otra vez. Trate de crear la lista con un conjunto de bucles for anidados.
Tengo que segundo lo que sugiere Leonardo-Santagada, con la particularidad de que la creación de N dimensionales / listas es muy unpythonic y se debe reconsiderar la forma en que está manteniendo sus datos y ver si no pertenece mejor en una clase o una lista de diccionarios (o diccionarios de listas).