2011-12-10 24 views
14

Duplicar posibles:
How to initialize a two-dimensional array in Python?forma más elegante para crear una matriz 2D en Python

siempre he escrito esta parte del código de esta manera: cada vez que lo necesito, me utilizar este código Python:

for x in range(8): 
     a.append([]) 
     for y in range(8): 
      a[x].append(0) 

Sin embargo, me gustaría saber si hay una manera de embellecer esta pieza de código. Quiero decir, ¿cómo se crea una matriz bidimensional en python y se completa con 0?

+0

este problema es de declarar e inicializar matriz bidimensional se explica muy bien [aquí] (http://stackoverflow.com/questions/2397141/how-to-initialize-a-two-dimensional-array-in-python) – gaurav

Respuesta

16

Uso nested list comprehensions:

a = [[0 for y in range(8)] for x in range(8)] 

que es eqivalent a

a = [] 
for x in range(8): 
    row = [] 
    for y in range(8): 
     row.append(0) 
    a.append(row) 
1

Puede utilizar list comprehensions. Dado que realmente no se preocupan por los valores proporcionados por range, puede utilizar _, que es convencionalmente representa un valor, que uno no le interesa.

>>> z = [[0 for _ in range(8)] for _ in range(8)] 
>>> import pprint 
>>> pprint.pprint(z) 
[[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, 0, 0, 0]] 

listas por comprensión proporcionan una manera concisa para crear listas sin recurrir al uso de map(), filter() y/o lambda. La definición de la lista resultante suele ser más clara que las listas creadas con esas construcciones.

2

La comprensión de la lista es más concisa.

a = [[0 for i in xrange(8)] for i in xrange(8)] 
print a 

O puede utilizar numpy arrays si va a hacer cálculos numéricos con la matriz. La función Numpy.zeros crea una matriz multidimensional de ceros.

import numpy as np 

a = np.zeros((8,8)) 
3

Prueba esto:

a = [[0]*8 for _ in xrange(8)] 

Utiliza listas por comprensión y el hecho de que el operador * se puede aplicar a las listas para llenarlas con n copias de un elemento dado.

O mejor aún, escribir una función genérica para el retorno de las matrices de un tamaño determinado:

# m: number of rows, n: number of columns 
def create_matrix(m, n): 
    return [[0]*n for _ in xrange(m)] 

a = create_matrix(8, 8) 
Cuestiones relacionadas