Python: inicializar lista multidimensional

Quiero inicializar una lista multidimensional. Básicamente, quiero una cuadrícula de 10×10: una lista de 10 listas, cada una con 10 elementos.

Cada valor de lista debe inicializarse al entero 0.

La forma obvia de hacer esto en una sola línea: myList = [[0]*10]*10 no funcionará porque produce una lista de 10 referencias a una lista, por lo que cambiar un elemento en cualquier fila lo cambia en todos filas

La documentación que he visto habla sobre el uso de [:] para copiar una lista, pero aún no funciona cuando se usa el multiplicador: myList = [0]*10; myList = myList[:]*10 myList = [0]*10; myList = myList[:]*10 tiene el mismo efecto que myList = [[0]*10]*10 .

myList.append() de crear un bucle de myList.append() s, ¿hay una manera rápida y eficiente de inicializar una lista de esta manera?

Puedes hacerlo de manera bastante eficiente con una lista de comprensión :

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

Este es un trabajo para … la lista de comprensión anidada!

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

Simplemente pensé que agregaría una respuesta porque la pregunta se refería al caso general de n-dimensiones y no creo que esa haya sido respondida todavía. Puede hacer esto recursivamente para cualquier número de dimensiones con el siguiente ejemplo:

 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]]] 

Es posible que necesites una matriz en lugar de algunas listas. Casi cada vez que veo este patrón de “lista anidada preconizada”, algo no está del todo bien.

Una solución adicional es usar la biblioteca NumPy:

 import numpy as np zero_array = np.zeros((10, 10), dtype='int') 

Esto se puede convertir fácilmente en una lista de python regular con el método .tolist() si es necesario.

Dos formas comunes y cortas de hacer esto:

Primero:

 [[0] * n] * m 

Segundo:

 [[0 for column in range(n)] for row in range(m)]