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í?

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top